java日志系统--log4j配置解析过程,源码分析

Logger.getLogger(Test.class);

从getLogger开始,就启动了log4j的整个工作流程,通过调用LogManager获取logger实例

return LogManager.getLogger(clazz.getName());

LogManager类里面有个静态块static{},【初始化重要信息】【root logger】,做一些配置,其中

url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
if(url == null) {
    url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
}

先尝试加载log4j.xml [DEFAULT_XML_CONFIGURATION_FILE] ,再尝试log4j.properties [DEFAULT_CONFIGURATION_FILE]

如果都没找到就报错了,不执行,所以【log4j必须先配置再使用】

log4j:WARN No appenders could be found for logger (Test).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

如果找到了配置文件,就会开始解析配置文件

//url是配置文件路径,LogManager.getLoggerRepository()是Hierarchy类
OptionConverter.selectAndConfigure(url, configuratorClassName,
                       LogManager.getLoggerRepository());
//继而开始调用
configurator = new PropertyConfigurator();
//加载properties配置文件
configurator.doConfigure(url, hierarchy);
//从这开始就解析所有配置信息的入口,可以设置断点,debug调试
doConfigure(props, hierarchy);

在doConfigure(props, hierarchy)方法里可以看到
1、配置log4j.configDebug或log4j.debug可以打开Loglog的debug输出 (Loglog是log4j内部的输出调试类)

//配置文件中打开Loglog的输出,debug
    String value = properties.getProperty(LogLog.DEBUG_KEY);
    if(value == null) {
      value = properties.getProperty("log4j.configDebug");
      if(value != null)
    LogLog.warn("[log4j.configDebug] is deprecated. Use [log4j.debug] instead.");
    }

    if(value != null) {
      LogLog.setInternalDebugging(OptionConverter.toBoolean(value, true));
    }

2、一些配置,log4j.reset、log4j.threshold

    String reset = properties.getProperty(RESET_KEY);
    if (reset != null && OptionConverter.toBoolean(reset, false)) {
          hierarchy.resetConfiguration();
    }

    String thresholdStr = OptionConverter.findAndSubst(THRESHOLD_PREFIX,
                               properties);
    if(thresholdStr != null) {
      hierarchy.setThreshold(OptionConverter.toLevel(thresholdStr,
                             (Level) Level.ALL));
      LogLog.debug("Hierarchy threshold set to ["+hierarchy.getThreshold()+"].");
    }

3、配置root logger,LoggerFactory等等

configureRootCategory(properties, hierarchy);
configureLoggerFactory(properties);

PropertyConfigurator类是主要的配置解析类,OptionConverter类是转换值true到boolen,获取根据key从properties取值交给PropertyConfigurator解析。
【一些主要方法的功能】
org.apache.log4j.PropertyConfigurator#configureRootCategory
解析配置文件中对root logger的配置 (log4j.rootLogger开头的配置)

org.apache.log4j.PropertyConfigurator#parseAdditivityForLogger
处理非root logger的additivity属性(默认为真,继承父logger的appenders)

org.apache.log4j.PropertyConfigurator#parseAppender
实例化配置中的appender(log4j.appender.开头 + appenderName)

org.apache.log4j.PropertyConfigurator#parseCategory
配置包括root logger的各个包内的logger (logger是Category的子类,表示各个不同包内的logger)

猜你喜欢

转载自blog.csdn.net/c5113620/article/details/79086254