日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2025/3/21 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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配置解析过程,源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。