2010-09-20 25 views
55

問題是否可以讓log4j顯示它用來配置自己的文件?

是否有可能讓Log4J顯示它用於配置的文件的完整路徑?


背景

我有一個log4j的愛恨交加。在好的時候,這很好,但當它不工作時,它可能是最難調試的事情之一。我管理我們應用程序中的所有日誌記錄。因此,我對日誌和default initialization procedure defined in the manual.非常熟悉,但似乎每隔幾個星期,日誌就會中斷,我會花費很多時間對問題進行整理。

這一次,它被嚴重破壞。每一個日誌聲明無處不在被轉儲到控制檯,我無法弄清楚爲什麼。上週使用我的log4j.xml文件的相同的確切代碼基礎突然使用其他配置。沒有明顯的變化。我唯一的猜測是,一些依賴已經改變,我懷疑Maven已經下載了一些破壞所有內容的邪惡JAR。

如果我能想出其配置文件Log4J的決定在啓動使用,我可以解決這個和其他大多數問題容易。


摘要

是否有某種方式來告訴Log4J的打印哪個文件是用於配置?另外,有沒有辦法打破正在運行的應用程序,並使用調試器來回答這個問題(可能用表達式或通過檢查變量)?

回答

61

是的,只需將log4j.debug添加到JVM系統變量。例如:

java -Dlog4j.debug -cp ... some.class.name 

Log4j的也就那麼輸出類似以下內容:

log4j: Trying to find [log4j.xml] using context classloader [email protected] 
log4j: Using URL [file:/C:/Users/matt/workspace/projectname/target/test-classes/log4j.xml] for automatic log4j configuration. 
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator 
log4j: System property is :null 
log4j: Standard DocumentBuilderFactory search succeded. 
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 
log4j: debug attribute= "null". 
log4j: Ignoring debug attribute. 
log4j: reset attribute= "false". 
log4j: Threshold ="null". 
... 

更多信息參見the manualthe FAQ

+0

太棒了!我等不及要明天再試。 – gMale 2010-09-21 00:08:33

0

我使用Log4J2,如果你想從你的Java程序中獲取文件這個工作對我來說:

LoggerContext lContect = LogManager.getContext(); 
Field f = lContect.getClass().getDeclaredField("configuration"); 
f.setAccessible(true); 
XmlConfiguration iWantThis = (XmlConfiguration) f.get(lContect); 
System.out.println("Config File: " + iWantThis.getName()); 
0

log4j的當量這是設置<Configuration status="trace">的配置文件中這將顯示加載log4j2配置文件的位置以及log4j2配置過程的其他內部詳細信息。默認情況下,狀態記錄器級別爲WARN,因此只有在出現問題時纔會看到通知。

如果配置文件找不到,仍然可以通過將系統屬性org.apache.logging.log4j.simplelog.StatusLogger.level設置爲TRACE來啓用log4j2內部狀態日誌記錄。

+2

但是,如果您試圖找出正在使用哪個配置值,將其添加到可能不是活動的配置值將無濟於事! – Omaha 2016-03-09 17:17:49

相關問題