這是本文件的舊版!


Indicate Log4j2 Configuration File

在使用IDE開發時,類似log4j1通常只要將設定檔放在classpath中,並且檔名為log4j2-test.properties或log4j2.properties,在編譯後就可以享用log功能。然而,在軟體發布並安裝到使用者系統時,設定檔並不完完全全會依照這個規則放置或命名,你很有可能會有不同的應用程式使用不同設定檔的需求。本篇文章主要分享要解決這個問題的設定方法。

指定設定檔

log4j2能接受的指定方式包含了log4j2.configurationFile與log4j.configurationFile兩種。假設設定檔log4j2-app.properties放置於工作目錄的config資料夾內,我的windows設定會如下方這樣,%BASE%是在script中會設定工作目錄的變數:

java %CLASSPATH% -Dlog4j2.configurationFile="%BASE%/config/log4j2-app.properties" org.tonylin.practice.App %*
這邊需要特別注意的是,在log4j1時,我們設定會使用到file:
-Dlog4j.configuration="file:%BASE%/config/log4j-app.properties"
但在logj2使用file的prefix時,就發生了檔案找不到的問題。後來發現root cause是%BASE%中包含空白字元而導致找不到檔案的問題,要解決這個問題你的空白字元就要以URL規則去encode:
-Dlog4j2.configurationFile="file:C:/Program%%20Files/App/config/log4j2-app.properties"
如上面範例,batch script要額外加上%去跳脫才能正常輸入,否則會把%2當成輸入參數。回歸正題,如果不需要加file prefix的話,我想沒有人會想自己把問題變困難吧?

出問題如何debug?

在發生檔案找不到的問題時,可以加上以下參數:

-Dlog4j2.debug=true
在我自行加上%20後,可以從log發現空白變成0的問題,就查覺到是沒做%跳脫的問題:
java.io.FileNotFoundException: file:C:\Program0Files\App\config\log4j2-app.properties (The filename, directory name, or volume label syntax is
incorrect)

指定log產生位置

設定檔搜尋規則