Java日志学习五:JDK Logger源码

时间:2021-07-12 19:49:19

一.JDK Logger

     JDK从1.4版本开始有了自己的日志系统,相比log4j slf4j jcl,JDK Logger显得简单明了,它没有像其它几个框架,都想去做门面,它只是简单的做了自己的事情。下一篇文章将详细比较这四个日志以及相互之间的桥接。在此不啰嗦。

 

二.JDK Logger核心类

  1. Logger:日志类。
  2. LogManager:日志管理类,读取配置文件,创建日志,缓存日志都有它完成了。类似于Log4j的LogManager。
  3. LogRecord:日志信息类。
  4. Level:日志级别。六个单词的国际化资源在sun.util.logging.resources.logging.properties里。Java代码  Java日志学习五:JDK Logger源码
    1. public static final Level OFF = new Level("OFF",Integer.MAX_VALUE, defaultBundle);  
    2.   
    3.  public static final Level SEVERE = new Level("SEVERE",1000, defaultBundle);  
    4.   
    5. public static final Level WARNING = new Level("WARNING"900, defaultBundle);  
    6.   
    7. public static final Level INFO = new Level("INFO"800, defaultBundle);  
    8.   
    9. public static final Level CONFIG = new Level("CONFIG"700, defaultBundle);  
    10.   
    11. public static final Level FINE = new Level("FINE"500, defaultBundle);  
    12.   
    13. public static final Level FINER = new Level("FINER"400, defaultBundle);  
    14.   
    15.  public static final Level FINEST = new Level("FINEST"300, defaultBundle);  
    16.   
    17. public static final Level ALL = new Level("ALL", Integer.MIN_VALUE, defaultBundle);  
     
  5. Formatter:格式化LogRecord。JDK Logging支持两种类型的FormatterSimpleFormatterXMLFormatter,默认采用SimpleFormatter,它先打印日期和时间、LoggerNamesource ClassName、方法名称,然后换行,在打印日志级别、本地化后的消息,然后换行,打印异常信息。而XMLFormatter实现getHead()getTail()方法,并且将每条记录写成一条<record></record>记录
  6. Handler:实现将日志写入指定目的地,如ConsoleHandlerFileHandlerSocketHandler即对应将日志写入控制台、文件、Socket端口。类似于Log4J中的Appender

    默认JDK Logging实现了StreamHandler,而StreamHandler有三个子类:ConsoleHandlerFileHandlerSocketHandlerStreamHandler支持的配置有:

    java.util.logging.StreamHandler.level 设置当前Handler支持的级别,默认为FINE

    java.util.logging.StreamHandler.filter 设置当前HandlerFilter,默认为null

    java.util.logging.StreamHandler.formatter 设置当前HandlerFormatter类,默认为SimpleFormatter

    java.util.logging.StreamHandler.encoding 设置当前Handler的编码方式,默认为null

三.Logger初始化

     Logger.getLogger(JavaLoggerTest.class.getName())开始

  1. LogManager manager = LogManager.getLogManager()。
    1. LogManager先进入静态初始化块,看系统变量里有没有定义java.util.logging.manager,有就实例化它作为LogManager,没有就创建一个LogManager,并为之设置rootLogger。
    2. 然后进入getLogManager方法,这里提供了一个用户自定义配置的方法
      1. 读取系统变量java.util.logging.config.class并实例化,我们可以在这个class的构造函数里做些事情。
      2. 读取系统变量java.util.logging.config.class定义的配置文件。
      3. 1 2 都没有的话,读取${java.home}/lib/logging.properties文件作为配置文件。
        1. reset,Reset the logging configuration, set initializedGlobalHandlers = true
        2. 读取config,并对属性值实例化,这里我们可以定义一些自己的操作。
        3. 读取.level,设置全局日志级别。
        4. 读取结束后就要开始初始化GlobalHandlers了,这个时候把initializedGlobalHandlers设置为false。
  2. 然后调用这个manager的demandLogger(String name)方法返回一个Logger对象。
    1. 检查缓存,有直接返回,这个是必然的。
    2. 没有就实例化一个Logger,然后放到缓存里去。这个时候会做以下事情
      1. 读取name+".level",设置这个日志的日志级别。
      2. 读取name+".handlers",为这个日志设置指定的Handler。
      3. 为此日志设置父日志,把父日志的配置应用到此日志上。

 

四.logging.properties配置文件

  1.  .level:全局日志级别。
  2. <name>.level:某个日志的日志级别。
  3. <handlerName>.level:某个Handler的日志级别。
  4. handlers:全局Handler设置。
  5. <name>.handlers:某个日志使用的Handler。
  6. config:自定义类。