jdk logging解析

Logger    日志处理主类,是Api入口
LoggerManager    日志管理器,Logger的工厂类,进行初始化Logger,Handler,Formatter等
Handler    
将日志信息记录到指定的流之中,可能是控制台或者是一个文件或者是任意存储区域。

常用实现类 ConsoleHandler, FileHandler, SocketHandler,一个Logger可以有多个handler

Formatter    日志信息格式化类。常用实现类 SimpleFormatter, XMLFormatter,可以自定义类,每个handler都可以持有一个formatter,默认ConsoleHandler使用SimpleFormatter,而FileHandler使用XMLFormatter
Level    
日志记录级别。

SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值)

ALL(记录所有信息)  OFF(不记录任何级别信息)

Filter    
过滤器,不同与日志级别,用于确定是否处理日志,,每个handler都可以持有一个filter,Logger会全局持有一个filter

LogRecord    
日志内容的封装类


jdk logging默认的配置文件是JRE_HOME/lib/logging.properties

############################################################
#      Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.  
# For example java -Djava.util.logging.config.file=myfile
############################################################
############################################################
#      Global properties
############################################################
# "handlers" specifies a comma separated list of log Handler
# classes.  These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
handlers= java.util.logging.ConsoleHandler
# To also add the FileHandler, use the following line instead.
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# Example to customize the SimpleFormatter output format
# to print one-line log message like this:
#     <level>: <log message> [<date/time>]
#
# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
com.xyz.foo.level = SEVERE

可以看到默认只是开启了ConsoleHandler,

可以自定义配置文件,handler和formatter:

下面代码演示从新的配置文件加载文件,并添加自己的handler

配置文件:

#Level的五个等级SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值)  。这个不同于log4j
#指定默认logger级别
.level= ALL
#为 Handler 指定默认的级别(默认为 Level.INFO)。
java.util.logging.ConsoleHandler.level=INFO
# 指定要使用的 Formatter 类的名称(默认为 java.util.logging.SimpleFormatter)。
java.util.logging.ConsoleHandler.formatter=com.hx.log.jdk.custom.MySimpleFormatter
# 为 Handler 指定默认的级别(默认为 Level.ALL)。
java.util.logging.FileHandler.level=INFO
# 指定要使用的 Formatter 类的名称(默认为 java.util.logging.XMLFormatter)。
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter
# 指定要写入到任意文件的近似最大量(以字节为单位)。如果该数为 0,则没有限制(默认为无限制)。
java.util.logging.FileHandler.limit=1024000
# 指定有多少输出文件参与循环(默认为 1)。
java.util.logging.FileHandler.count=1
# 为生成的输出文件名称指定一个模式。有关细节请参见以下内容(默认为 "%h/java%u.log")。
java.util.logging.FileHandler.pattern=u.xml
# 指定是否应该将 FileHandler 追加到任何现有文件上(默认为 false)。
java.util.logging.FileHandler.append=true
handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler

MyLogManager.java:


package com.hx.log.jdk.custom;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.*;
public class MyLogManager {
  public static void resetFromPropertyFile(String filePath) {
    LogManager logManager = LogManager.getLogManager();
    logManager.reset();
    InputStream inputStream = MyLogManager.class.getClassLoader().getResourceAsStream(filePath);
    try {
      logManager.readConfiguration(inputStream);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public static Logger getLogger(String name) {
    Logger logger = Logger.getLogger(name);
    logger.setLevel(Level.ALL);
    for (Handler handler : logger.getHandlers()) {
      logger.removeHandler(handler);
    }
    // add console  handler
    ConsoleHandler consoleHandler = new ConsoleHandler();
    consoleHandler.setLevel(Level.INFO);
    consoleHandler.setFormatter(new MySimpleFormatter());
    consoleHandler.setFilter(new Filter() {
      @Override
      public boolean isLoggable(LogRecord record) {
        return true;
      }
    });
    logger.addHandler(consoleHandler);
    // add file handler
    FileHandler fileHandler;
    try {
      fileHandler = new FileHandler("file.log", true);
      fileHandler.setLevel(Level.INFO);
      fileHandler.setFormatter(new MySimpleFormatter());
      logger.addHandler(fileHandler);
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    // add default stream handler
    MyStreamHandler defaultStreamHandler = new MyStreamHandler();
    defaultStreamHandler.setLevel(Level.INFO);
    defaultStreamHandler.setFormatter(new MySimpleFormatter());
    defaultStreamHandler.setOutputStream(System.out);
    logger.addHandler(defaultStreamHandler);
    return logger;
  }
}
MySimpleFormatter.java:

package com.hx.log.jdk.custom;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;

public class MySimpleFormatter extends SimpleFormatter {
  private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  @Override
  public synchronized String format(LogRecord record) {
    StringBuilder sb = new StringBuilder();
    Level level = record.getLevel();
    String time = sdf.format(new Date(record.getMillis()));
    String loggerName = record.getLoggerName();
    String message = record.getMessage();
    sb.append("[").append(level).append("]");
    sb.append(" ").append(time);
    sb.append(" ").append(loggerName);
    sb.append(" :").append(message);
    sb.append(" ");
    return sb.toString();
  }
}
MyStreamHandler.java:

package com.hx.log.jdk.custom;
import java.io.OutputStream;
import java.util.logging.StreamHandler;
public class MyStreamHandler extends StreamHandler {
  @Override
  public synchronized void setOutputStream(OutputStream out)
          throws SecurityException {
    super.setOutputStream(out);
  }
}
Test.java:

package com.hx.log.jdk.custom;
/**
 * Created by hx on 17-1-7.
 */
import junit.framework.TestCase;
import java.io.IOException;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class Test  extends TestCase{
  public void testDefault(){
    Logger logger=Logger.getLogger(Test.class.getName());//使用默认的配置
    logger.setFilter(new Filter() {
      @Override
      public boolean isLoggable(LogRecord record) {
        return true;
      }
    });
    logger.info(" test!");
  }
  public  void testMy()  throws SecurityException, IOException {
      MyLogManager.resetFromPropertyFile("log/jdk/logging.properties");
    Logger logger=MyLogManager.getLogger(Test.class.getName());
    logger.setFilter(new Filter() {
      @Override
      public boolean isLoggable(LogRecord record) {
        return true;
      }
    });
    logger.info(" test!");
  }
}
使用方法testdefault,只是在控制台打印信息:ConsoleHandler(System.err)

使用方法testMy测试,会输出到五个目的地,包括自定义配置文件的ConsoleHandler(System.err),FileHandler(u.xml文件)和

MyLoggerManager中添加的ConsoleHandler(System.err),FileHandler(file.log)和MyStreamHandler(System.out)

原文地址:https://www.cnblogs.com/xingxingge/p/10311476.html