[英]Where/how does log4j look for a log4j.properties file?
我正在一個簡單的測試應用程序中試用 log4j。 我在 eclipse 中創建了一個新的 Java 項目,並將 log4j JAR (v1.2.16) 添加到我的構建路徑中。 然后我創建了一個打印 Hello World 的簡單類。 然后我使用 log4j Logger
類來記錄信息消息。 當我運行應用程序時,我看到日志消息,使用我假設的默認附加程序和布局。 偉大的。 我遇到的問題是添加我自己的配置。 這就是我所做的:
創建了一個帶有自定義附加程序和日志級別的 log4j.properties 文件,並將其放入 src 文件夾(編譯時將其復制到 bin 文件夾)。 運行應用程序 - 沒有變化。
我嘗試添加PropertyConfigurator.configure("log4j.properties")
。 運行應用程序 - 沒有變化。 沒有錯誤,但沒有變化。
我該怎么做才能讓 log4j 加載我的配置文件?
查看“ 默認初始化程序”標題下的手冊,您將在其中找到以下內容:
確切的默認初始化算法定義如下:
- 將
log4j.defaultInitOverride
系統屬性設置為“false
”以外的任何其他值將導致 log4j 跳過默認初始化過程(此過程)。- 將資源字符串變量設置為
log4j.configuration
系統屬性的值。 指定默認初始化文件的首選方法是通過log4j.configuration
系統屬性。 如果系統屬性 log4j.configuration 未定義,則將字符串變量資源設置為其默認值“log4j.properties
”。- 嘗試將資源變量轉換為 URL。
- 如果資源變量無法轉換為 URL,例如由於 MalformedURLException,則通過調用返回 URL 的 org.apache.log4j.helpers.Loader.getResource(resource, Logger.class) 從類路徑中搜索資源. 請注意,字符串“
log4j.properties
”構成了格式錯誤的 URL。 有關搜索位置的列表,請參閱Loader.getResource(java.lang.String) 。- 如果找不到 URL,則中止默認初始化。 否則,從 URL 配置 log4j。 PropertyConfigurator將用於解析 URL 以配置 log4j,除非 URL 以“
.xml
”擴展名結尾,在這種情況下將使用DOMConfigurator 。 您可以選擇指定自定義配置器。log4j.configuratorClass
系統屬性的值被視為自定義配置器的完全限定類名。 您指定的自定義配置器必須實現Configurator
接口。
啊。 我發現問題是 eclipse 導入了錯誤的Logger
類。 它導入了 java.util.logging.Logger ,當然它有自己的配置,與 log4j 不同。 哦,好吧,希望其他人這樣做並通過閱讀這個問題來解決它。
您可以通過設置log4j.debug
系統屬性來啟用 log4j 內部調試。 除此之外,這將導致 log4j 顯示它如何配置自身。
您可以嘗試使用log4j.configuration
系統屬性顯式設置配置文件的 URL。
另見: 這個問題。
如果定義了classpath
,問題可能出在classpath
classpath
中。
它沒有加載的原因(在我的情況下):我的一個 jar 中有一個沖突的log4j.properties
文件,並且它重載了我的classpath
中的那個。
簡而言之,如果您的log4j.properties
文件未加載,則可能在其他地方有另一個覆蓋它的文件。
只是想我也會把它扔進去,以防其他人遇到這個。 我剛剛花了最后 5 個小時試圖弄清楚為什么我的默認log4j.properties
無法加載。
log4j.properties
應該在您的類路徑中。 復制到“bin 文件夾”的“src 文件夾”(我假設您在這里說的是 Eclipse 設置),通常屬於您的類路徑,因此應該可以找到它(您是否將它放在“src " 文件夾,對嗎?)
我知道這已經有幾個月了,但我覺得有必要指出 scr 文件夾沒有“復制”到 bin 文件夾,也不是運行時類路徑的一部分......(構建路徑不是運行時類路徑!)。 Eclipse 將 src 文件夾中的源文件編譯到 bin(或任何您喜歡的)文件夾中。 bin 文件夾是運行時類路徑的一部分。
只是想指出這一點,因為這些線程也經常被非常初級的程序員閱讀,我總是很沮喪,因為他們中的大多數人沒有掌握 Java 類路徑的技巧,因此對它犯了可以避免的錯誤。
只是將它扔給任何正在努力加載 log4j.properties 的人。
我通過添加以下行來修復我的:
-Dlog4j.defaultInitOverride=TRUE
原來使用該 JVM 參數,可以告訴 Log4j 不要使用Default Initialization Procedure
並創建自己的。
我和我的斗爭。 我從干凈的 JAR 構建到整個 REPO 拉取,沒有任何效果。 結合它和清理類文件使它工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.