2009-12-03 153 views
48

我有一個正常的應用程序INFO級別日誌。我需要的是另外記錄所有錯誤級別事件以單獨錯誤日誌。我正在使用這樣的配置:如何將log4j配置爲將不同日誌級別記錄到同一個記錄器的不同文件

<logger name="com.acme"> 
    <level value="error"/> 
    <appender-ref ref="error"/> 
</logger> 

<logger name="com.acme"> 
    <level value="info"/> 
</logger> 

<root> 
    <level value="warn"/> 
    <appender-ref ref="general"/> 
</root> 

此配置僅記錄錯誤。如果我先放置信息級記錄器,那麼它只會記錄到一般的appender,但錯誤記錄器不起作用。我想讓他們都工作。

回答

60

你需要做的是有一個單一的<logger>定義,並具有定義的INFO級別,但是在你的兩個appender定義中,你可以相應地設置它們的閾值。

<appender name="ERROR_FILE"> 
    <param name="Threshold" value="ERROR"/> 
</appender> 

<appender name="GENERAL"> 
    <param name="Threshold" value="INFO"/> 
</appender> 

你那麼這兩個附加目的地添加到您的記錄:

<logger name="com.acme"> 
    <level value="INFO"/> 
    <appender-ref ref="ERROR_FILE"/> 
    <appender-ref ref="GENERAL"/> 
</logger> 

日誌條目現在要記錄儀將被髮送到兩個附加目的地,但由於它們具有不同的獨立的閾值時,ERROR_FILE附加器不僅會記錄錯誤和以上。

+0

@vilmonts如果你定義了相同的記錄器(com.acme)兩次,其中一人被覆蓋,這就是爲什麼你不能看到INFO消息:第一個消息(帶有「錯誤」級別)擦除下一消息(帶有「info」消息)。 – 2009-12-03 13:42:04

+1

謝謝,skaffman。你救了我的命。 – vilmonts 2009-12-04 11:52:03

+1

但我想允許我的ERROR_FILE appender獲得某些其他記錄器的選定調試消息?! – AmanicA 2012-08-03 23:59:25

4

您需要使用log4j的過濾器:

<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
    <param name="levelMin" value="ERROR" /> 
    <param name="levelMax" value="ERROR" /> 
</filter> 

這樣,你可以爲每個級別分別創建日誌文件。

+0

這是一個很好的答案。我爲我的log4j配置使用.properties文件。你能否在你的回答中包括如何在.properties中配置這個過濾器?請 – 2016-02-26 13:22:32

5

包括在文件名中日全面有效的解決方案:

<appender name="InfoFileAppender" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="FileNamePattern" value="/var/output/Info_%d{ddMMyyyy}.log" /> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" /> 
    </layout> 
    <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
     <param name="levelMin" value="INFO" /> 
     <param name="levelMax" value="INFO" /> 
    </filter> 
</appender> 

<appender name="ErrorFileAppender" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <param name="Threshold" value="ERROR" /> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="FileNamePattern" value="/var/output/Error_%d{ddMMyyyy}.log" /> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" /> 
    </layout> 
</appender> 
<root> 
    <level value="INFO" /> 
    <appender-ref ref="InfoFileAppender" /> 
    <appender-ref ref="ErrorFileAppender" /> 
</root> 
相關問題