2012-12-24 41 views
13

是否有可能在運行時檢索log4j中配置的所有appender列表?在運行時檢索Log4J Appender列表

我會充實這個場景。鑑於以下配置我將如何檢索所有appender(stdout和altstdout)?

log4j.rootLogger=error, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 

log4j.appender.altstdout=org.apache.log4j.ConsoleAppender 
log4j.appender.altstdout.layout=org.apache.log4j.PatternLayout 

# Pattern to output the caller's file name and line number. 
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 
log4j.appender.altstdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 
+0

單獨訪問rootLogger的appender你使用的是lo4j 1.2還是log4j2?因爲它們具有不同的API,所以標記兩者都很混亂。 – Simulant

回答

11

如果你想獲得配置的所有記錄儀的所有追加程序必須做這樣的事情

for (Enumeration loggers=LogManager.getCurrentLoggers(); loggers.hasMoreElements();) { 
    Logger logger = (Logger) loggers.nextElement(); 
    for (Enumeration appenders=logger.getAllAppenders(); appenders.hasMoreElements();) { 
     Appender appender = (Appender) appenders.nextElement(); 
     ... 

我不知道爲什麼log4j沒有像LogManager.getAllAppenders()這樣的方法,但它看起來像
的缺點。

+0

這會起作用,但它與我們的需求並不相關。我正在創建一個日誌配置應用程序,所以我們可以動態地創建/修改記錄器。這基本上需要目前尚未使用的appender。最後,我創建了一個配置了所有appender的記錄器,並且始終將其設置爲OFF。 – binarymelon

+3

這可能適用於log4j,但最終不適用於log4j2,因爲在log4j2中不存在LogManager.getCurrentLoggers()都不是Logger.getAllAppenders()。 – Joe

+1

那麼你如何在log4j2中做到這一點 –

0

我想添加一些需要一段時間才能理解的內容。 如果您看下面的圖(我從here複製而來),您可以看到,即使記錄器com.foo.bar將打印到根記錄器FileAppender,它的appender列表仍然爲空。所以你不能讓記錄器用方法logger.getAllAppenders()寫入所有的appender。

enter image description here

爲此,您需要通過所有的家長也和根記錄迭代seperately。因爲無法將logger.getParent()迭代到根記錄器(根記錄器返回null - 請參閱getParent()的文檔)。據我所知,你必須通過Logger.getRootLogger().getAllAppenders().