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)