本篇文章主要針對Log4j2設定的基本結構做介紹,讓大家可以快速進入Log4j2的世界。Log4j2的configuration file提供了XML、JSON、YAML與properties設定的方式,為了利於Log4j1轉換到Log4j2的格式銜接,我選擇了properties格式做介紹。
一個Log4j2的設定檔,幾乎都會有以下三個元素,包含全域定義、Appender定義與Logger定義。接下來將會針對這三個元素做基本介紹。
# part1 全域定義 status = warn name= CommonLogSettingForUnitTests rootLogger = DEBUG, CONSOLE # part2 Appender定義 appender.console.type = Console appender.console.name = CONSOLE appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{mm:ss,SSS}|%5p[%t] (%F:%M:%L) %m %n appender.console.filter.threshold.type = ThresholdFilter appender.console.filter.threshold.level = ALL # part3 Logger定義 logger.reflections = DEBUG, CONSOLE logger.reflections.name = org.reflections.Reflections logger.reflections.additivity = false logger.default = DEBUG, CONSOLE logger.default.name = org.tonylin.practice logger.default.additivity = false
以本篇範例所提及的項目來說:
status = warn name= CommonLogSettingForUnitTests rootLogger = DEBUG, CONSOLE
除了我介紹的三個項目以外,目前我有看到的全域定義還有filter、properties,可用於定義預設log過濾規則與變數定義,有興趣的人可以先自行研究,之後文章有用到我再說明。
Appender定義我認為是log4j設定檔中最複雜的一塊,因為這個完全取決於你:log格式為何、要log在哪裡、log保留形式為何等等,這也是安全性最容易出問題的地方。我先針對範例有提及的元素做說明。
appender.console.type = Console appender.console.name = CONSOLE appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{mm:ss,SSS}|%5p[%t] (%F:%M:%L) %m %n appender.console.filter.threshold.type = ThresholdFilter appender.console.filter.threshold.level = ALL
假如我要設定第二組不同的Console設定的話,範例如下,另外只要在Logger設定中指定CONSOLE2即可:
appender.console2.type = Console appender.console2.name = CONSOLE2 ...
這個就是決定了你哪些東西需要做log與對應的appender為何。以本篇範例來說,總共設定了兩組logger(key以reflections與default區分),兩者差別只在於:
不滿足以上規則的class或package,就會套用在全域定義中rootLogger的方式。接下來針對範例有提及的元素做說明,用reflections這組為例。
logger.reflections = DEBUG, CONSOLE logger.reflections.name = org.reflections.Reflections logger.reflections.additivity = false logger.default = DEBUG, CONSOLE logger.default.name = org.tonylin.practice logger.default.additivity = false
註: 如果全域定義中有設定ThresholdFilter與對應的level,要注意會以全域定義的為主。