java log 配置,java日志系统--log4j配置解析过程,源码分析
log4j 可以看成是非常類似jdk logger 結構 ,有個logger 與logManger
都是在logManger的靜態塊中初始化類,加載配置文件
Logger.getLogger(Test.class);
1
從getLogger開始,就啟動了log4j的整個工作流程,通過調用LogManager獲取logger實例
return LogManager.getLogger(clazz.getName());
1
LogManager類里面有個靜態塊static{},【初始化嘗試讀取配置文件】先嘗試加載log4j.xml [DEFAULT_XML_CONFIGURATION_FILE] ,再嘗試log4j.properties [DEFAULT_CONFIGURATION_FILE]
url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
if(url == null) {
url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
}
1
2
3
4
如果找到了配置文件,就會開始解析配置文件
//url是配置文件路徑,LogManager.getLoggerRepository()是Hierarchy類
OptionConverter.selectAndConfigure(url, configuratorClassName,
LogManager.getLoggerRepository());
//繼而開始調用
configurator = new PropertyConfigurator();
//加載properties配置文件
configurator.doConfigure(url, hierarchy);
//從這開始就解析所有配置信息的入口,可以設置斷點,debug調試
doConfigure(props, hierarchy);
1
2
3
4
5
6
7
8
9
在doConfigure(props, hierarchy)方法里可以看到
1、添加java vm 啟動參數 -Dlog4j.configDebug=true或-Dlog4j.debug=true可以打開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));
}
1
2
3
4
5
6
7
8
9
10
11
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()+"].");
}
1
2
3
4
5
6
7
8
9
10
11
12
3、配置root logger,LoggerFactory等等
configureRootCategory(properties, hierarchy);
configureLoggerFactory(properties);
1
2
PropertyConfigurator類是主要的配置解析類,OptionConverter類是轉換值true到boolen,獲取根據key從properties取值交給PropertyConfigurator解析。
LogManager的靜態塊主要是初始化自己(實例化repositorySelector,讀取配置),【root logger默認debug】【Hierarchy 是loggerfactory,提供有層級的,父子關系的logger】
Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
1
LogManager.getLogger里面getLoggerRepository().getLogger(name);
就是通過Hierarchy.getLogger(name)取得logger實例
Hierarchy內部使用Hashtable ht 保存key為name的logger實例,單例模式,
1
2
3
這樣就完成了獲取logger
當調用logger記錄日志時,默認是debug等級
logger.debug(“debug”);
logger.debug("debug");
觸發
forcedLog(FQCN, Level.DEBUG, message, null);
callAppenders(new LoggingEvent(fqcn, this, level, message, t));
//writes 初始0, ?writes += c.aai.appendLoopOnAppenders(event);就是配置的appender(aai是AppenderAttachableImpl就是logger里保存定義的多個appender)
if(writes == 0) {
repository.emitNoAppenderWarning(this);//輸出沒有配置appender的警告
}
1
2
3
4
5
6
7
8
9
如果logger沒有找到appender,就是具體的日志處理,就報錯了,不執行,所以【log4j必須先配置再使用】
可以在main方法中 【BasicConfigurator.configure();】 快速初始化
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.
1
2
3
【一些主要方法的功能】
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)
————————————————
總結
以上是生活随笔為你收集整理的java log 配置,java日志系统--log4j配置解析过程,源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 导出matlab程序,Matlab数据导
- 下一篇: java信息管理系统总结_java实现科