2011-04-06 22 views
0

我很疑惑爲什麼INFO語句會使它進入控制檯。下面是一般設置:幫我理解log4j appender相對於優先級的可加性

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <param name="Threshold" value="DEBUG"/> 
    <layout .../> 
</appender> 

<appender name="REST_LOG" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="File" value="/logs/rest.log" /> 
    <param name="Threshold" value="INFO" /> 
    .... 
</appender> 

<category name="xyz.web"> 
    <priority value="WARN" /> 
    <appender-ref ref="CONSOLE" /> 
</category> 

<category name="xyz.web.rest"> 
    <priority value="INFO" /> 
    <appender-ref ref="REST_LOG" /> 
</category> 

所以我想INFO和上述聲明僅做REST_LOG並警告語句和上面去REST_LOG和控制檯。我所看到的是來自xyz.web.rest的INFO語句在REST_LOG中的預期,但也看到了來自CONSOLE中xyz.web.rest的INFO語句,這是我沒有想到的。

有人可以解釋發生了什麼嗎?

回答

1

閾值是分層的。 DEBUG包含所有INFO,WARN,ERROR。所以很自然的是,如果你定義了一個DEBUG閾值的控制檯,它會收到INFO級別的消息。

如果您只希望控制檯接收WARN和ERROR,請將其閾值設置爲WARN。

4

您應該在xyz.web.rest記錄器上設置加法爲假。

沒有你會看到所有的INFO消息在控制檯登錄與記錄xyz.web.rest兩次加,因爲記錄器繼承根記錄 和xyz.web記錄器的附加器。

請參閱log4j文檔

命名層次的Appenders and Layouts部分
記錄程序被認爲是另一個記錄 的祖先,如果它的名字後面加一個點是後代記錄器的前綴 名稱。如果在自身和後代記錄器之間存在沒有祖先的記錄器,則稱其爲父記錄器。

例如,名爲「com.foo」的記錄器是名爲「com.foo.Bar」的記錄器 的父級。同樣,「java」是「java.util」的父代,而「java.util.Vector」的祖先是 。這個命名方案應該是大多數開發者熟悉的 。

根記錄器駐留在記錄器層次結構的頂部。它是特殊的方法有兩種:

  1. 它總是存在的,
  2. 無法通過名稱檢索。

Appender和Layout

對於給定的記錄器每個啓用日誌請求將在記錄器,以及在 層次更高的附加目的地被轉發到 所有追加程序。例如,如果將控制檯appender添加到 根日誌記錄器,則所有啓用的日誌記錄請求將至少在控制檯的 上打印。

如果另外一個文件appender被添加到記錄器中,比如說C,那麼 啓用C和C孩子的記錄請求將打印在文件 和控制檯上。可以覆蓋此默認行爲 ,以便通過將 可加性標誌設置爲false,使附加程序累積不再具有可加性。

+0

我可以知道如何將特定appender的加號標誌設置爲false?例如,我有一個針對錯誤的appender,另一個針對WARN的appender。我不想看到ERROR日誌文件中包含的WARN內容。我希望WARN日誌只出現在WARN日誌文件中,但不出現在ERROR日誌文件中。我可以知道這可以做到嗎? – huahsin68 2013-08-13 03:11:29