差異處

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

連向這個比對檢視

java:log4j2:indicateconfigurationfile [2022/04/10 10:14]
tony [指定設定檔]
java:log4j2:indicateconfigurationfile [2023/06/25 09:48]
行 1: 行 1:
-{{tag>​log4j2}} 
-====== Indicate Log4j2 Configuration File ====== 
-===== Problem ===== 
-在使用IDE開發時,類似log4j1通常只要將設定檔放在classpath中,並且檔名為log4j2-test.properties或log4j2.properties,在編譯後就可以享用log功能。然而,在軟體發布並安裝到使用者系統時,設定檔並不完完全全會依照這個規則放置或命名,你很有可能會有不同的應用程式使用不同設定檔的需求。本篇文章主要分享要解決這個問題的設定方法。 
-===== How to? ===== 
-==== 指定設定檔 ==== 
-log4j2能接受的指定方式包含了log4j2.configurationFile與log4j.configurationFile兩種。假設設定檔log4j2-app.properties放置於工作目錄的config資料夾內,我的windows設定會如下方這樣,%BASE%是在script中會設定工作目錄的變數:​ 
-<code bash> 
-java %CLASSPATH% -Dlog4j2.configurationFile="​%BASE%/​config/​log4j2-app.properties"​ org.tonylin.practice.App %* 
-</​code>​ 
-這邊需要特別注意的是,在log4j1時,我們設定會使用到file:​ 
-<code bash> 
--Dlog4j.configuration="​file:​%BASE%/​config/​log4j-app.properties"​ 
-</​code>​ 
-但在logj2使用file的prefix時,就發生了檔案找不到的問題。後來發現root cause是%BASE%中包含空白字元而導致找不到檔案的問題,要解決這個問題你的空白字元就要以URL規則去encode:​ 
-<code bash> 
--Dlog4j2.configurationFile="​file:​C:/​Program%%20Files/​App/​config/​log4j2-app.properties"​ 
-</​code>​ 
-如上面範例,batch script要額外加上%去跳脫才能正常輸入,否則會把%2當成輸入參數。回歸正題,如果不需要加file prefix的話,我想沒有人會想自己把問題變困難吧?​ 置於file的問題是不是log4j2沒處理好空白的問題,我就沒深究了。 
-==== 出問題如何debug?​ ==== 
-在發生檔案找不到的問題時,可以加上以下參數:​ 
-<code bash> 
--Dlog4j2.debug=true 
-</​code>​ 
-在我自行加上%20後,可以從log發現空白變成0的問題,就查覺到是沒做%跳脫的問題:​ 
-<​code>​ 
-java.io.FileNotFoundException:​ file:​C:​\Program0Files\App\config\log4j2-app.properties (The filename, directory name, or volume label syntax is 
-incorrect) 
-</​code>​ 
  
-==== 指定log產生位置 ==== 
- 
- 
-==== 設定檔搜尋規則 ==== 
- 
- 
- 
-===== Reference ===== 
-  * [[https://​logging.apache.org/​log4j/​2.x/​manual/​configuration.html#​Automatic%20Configuratio|官方網站檔案設定介紹]] 
-=====    ===== 
----- 
-\\ 
-~~DISQUS~~