差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:log4j2:helloworld [2022/04/10 00:14]
tony [Appender定義]
java:log4j2:helloworld [2023/06/25 09:48] (目前版本)
行 29: 行 29:
 </​code>​ </​code>​
 ===== 全域定義 ===== ===== 全域定義 =====
-全域定義我把它當成一種預設值的宣告。以本篇範例所提及的項目來說:​+以本篇範例所提及的項目來說:​
 <code properties>​ <code properties>​
 status = warn status = warn
行 37: 行 37:
   * **status**: 設定log4j本身的事件的level,會以console形式輸出。如果你懷疑log4j設定有問題,可以改這個設定成trace或debug去看問題出在哪,也可以透過設定system properties "​log4j2.debug=true"​去enable所有log內容。   * **status**: 設定log4j本身的事件的level,會以console形式輸出。如果你懷疑log4j設定有問題,可以改這個設定成trace或debug去看問題出在哪,也可以透過設定system properties "​log4j2.debug=true"​去enable所有log內容。
   * **name**: configuration file所對應的configuration名稱。這個目前看起來有將設定分在多個檔案的情況才比較有用,可以參考[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​XInclude|XInclude]]與[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​CompositeConfiguration|CompositeConfiguration]]。   * **name**: configuration file所對應的configuration名稱。這個目前看起來有將設定分在多個檔案的情況才比較有用,可以參考[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​XInclude|XInclude]]與[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​CompositeConfiguration|CompositeConfiguration]]。
-  * **rootLogger**:​ 等同於log4j1的log4j.rootLogger,沒有設定logger的預設行為。以我的範例來說,就是希望針對DEBUG level以上的所有情況,去使用CONSOLE appender定義的方式做log。+  * **rootLogger**:​ 等同於log4j1的log4j.rootLogger,沒有設定logger的預設行為。以我的範例來說,就是希望針對DEBUG level以上的所有情況,去使用CONSOLE appender定義的方式做log。如果要串多組appender,就直接加在CONSOLE後,以逗號區隔
 除了我介紹的三個項目以外,目前我有看到的全域定義還有[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​Configuring%20Filters|filter]]、[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​Property%20Substitution|properties]],可用於定義預設log過濾規則與變數定義,有興趣的人可以先自行研究,之後文章有用到我再說明。 除了我介紹的三個項目以外,目前我有看到的全域定義還有[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​Configuring%20Filters|filter]]、[[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​Property%20Substitution|properties]],可用於定義預設log過濾規則與變數定義,有興趣的人可以先自行研究,之後文章有用到我再說明。
 ===== Appender定義 ===== ===== Appender定義 =====
-Appender定義我認為是log4j設定檔中最複雜的一塊,因為這個完全取決於你:​**log格式為何**、**要log在哪裡**、**log保留形式為何**等等,這也是安全性最容易出問題的地方。我先針對本篇範例有提及的元素做說明。+Appender定義我認為是log4j設定檔中最複雜的一塊,因為這個完全取決於你:​**log格式為何**、**要log在哪裡**、**log保留形式為何**等等,這也是安全性最容易出問題的地方。我先針對範例有提及的元素做說明。
 <code properties>​ <code properties>​
 appender.console.type = Console appender.console.type = Console
行 49: 行 49:
 appender.console.filter.threshold.level = ALL appender.console.filter.threshold.level = ALL
 </​code>​ </​code>​
-  * **type**: 這個影響的是**要log在哪裡**與**log保留形式**,以範例來說是輸出到Conosle上。也有可能會輸出到file、syslog、smtp、database,取決於你的需求而使用不同的appender type。我有使用到的項目會再整理其它文章內容給大家參考。 +  * **appender.console.type**: 這個影響的是**要log在哪裡**與**log保留形式**,以範例來說是輸出到Conosle上。也有可能會輸出到file、syslog、smtp、database,取決於你的需求而使用不同的appender type。我有使用到的項目會再整理其它文章內容給大家參考。 
-  * **name**: Appender的名稱,提供給後續Logger定義做參考使用。 +  * **appender.console.name**: Appender的名稱,提供給後續Logger定義做參考使用。 
-  * **layout**: 這個影響的是**log格式**,可以參考[[https://​logging.apache.org/​log4j/​2.x/​manual/​layouts.html|link]]去設定你想要的樣子。以這個範例來說,輸出會長這樣子:​ **47:​27,​691| INFO[main] (ClassName.java:​MetohdName:​59) hello world!**。 +  * **appender.console.layout**: 這個影響的是**log格式**,可以參考[[https://​logging.apache.org/​log4j/​2.x/​manual/​layouts.html|link]]去設定你想要的樣子。以這個範例來說,輸出會長這樣子:​ **47:​27,​691| INFO[main] (ClassName.java:​MetohdName:​59) hello world!**。 
-  * **filter**: 這是用來設定需要log的條件,以本篇範例來說,因為設定成ALL,代表要log所有內容。 +  * **appender.console.filter**: 這是用來設定此appender需要log的條件,以本篇範例來說,因為設定成ALL,代表要log所有內容。 
-假如我要設定第二組不同的Console設定的話,範例如下:​+假如我要設定第二組不同的Console設定的話,範例如下,另外只要在Logger設定中指定CONSOLE2即可:
 <code properties>​ <code properties>​
 appender.console2.type = Console appender.console2.type = Console
行 59: 行 59:
 ... ...
 </​code>​ </​code>​
- 
 ===== Logger定義 ===== ===== Logger定義 =====
 +這個就是決定了你哪些東西需要做log與對應的appender為何。以本篇範例來說,總共設定了兩組logger(key以reflections與default區分),兩者差別只在於:​
 +  * **logger.reflections**:​ 設定套用在org.reflections.Reflections這個class上。
 +  * **logger.default**:​ 設定套用在org.tonylin.practice這個底下所有的packages。
 +不滿足以上規則的class或package,就會套用在全域定義中rootLogger的方式。接下來針對範例有提及的元素做說明,用reflections這組為例。
 +<code properties>​
 +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
 +</​code>​
 +  * **logger.reflections**:​ 定義log的方式,與rootLogger定義方式相同。
 +  * **logger.reflections.name**:​ 定義logger所對應的package或class。
 +  * **logger.reflections.additivity**:​ 目前我還摸不清它的訊息附加的規則是怎樣執行的,假如你有發現訊息重複log的情況,不妨把它設成false看看。
 +註: 如果全域定義中有設定ThresholdFilter與對應的level,要注意會以全域定義的為主。
 ===== Reference ===== ===== Reference =====
   * [[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html|官方網站檔案設定介紹]]   * [[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html|官方網站檔案設定介紹]]