2014-08-27 17 views
4

我覺得這個代碼解釋不夠好,我想要做的如何配置log4j2的可加性以尊重家長的級別?

package us.benanderson; 

public class MyClass { 

    private static final Logger LOG = LogManager.getLogger(MyClass.class); 
    ... 
    // within a method 
    LOG.debug("only output to appFile"); 
    LOG.error("output to both appFile and errorFile"); 

這是我猜應該是我的配置

<Loggers> 
    <Logger name="us.benanderson" level="debug" additivity="true"> 
     <AppenderRef ref="appFile" /> 
    </Logger> 

    <Root level="error"> 
     <AppenderRef ref="errorFile" /> 
    </Root> 
</Loggers> 

不過,我發現,當加=「true」,調試消息也會輸出到errorFile。當additivity =「false」時,不會輸出到errorFile。有沒有辦法做我想做的事情?

回答

5

我認爲最簡單的方式來實現你想要的是直接把一個水平上的appender-REF。這消除了在配置中使用命名記錄器的必要,簡化了一些配置。

如果您想將某個包的日誌事件重定向到單獨的appender,那麼命名記錄器仍然有用。如果你想要做的更不尋常的過濾

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Appenders> 
    <File name="appFile" fileName="logs/appFile.log" append="true"> 
     <PatternLayout pattern="%-5p %d{ABSOLUTE} [%t] %c - %m%n" /> 
    </File> 
    <File name="errorFile" fileName="logs/errorFile.log" append="true"> 
     <PatternLayout pattern="%-5p %d{ABSOLUTE} [%t] %c - %m%n" /> 
    </File> 
    </Appenders> 
    <Loggers> 
    <Root level="trace"> 
     <AppenderRef ref="appFile" level="debug" /> 
     <AppenderRef ref="errorFile" level="error" /> 
    </Root> 
    </Loggers> 
</Configuration> 

閾值過濾器和過濾器的組合會特別有用。 (!)舉例來說,如果你想只發送信息,警告級別的事件有一定的appender,不包括跟蹤/調試,並排除錯誤和FATAL級別的事件,你可以這樣做:

<Console name="only-info-warn"> 
    <PatternLayout pattern="%-5p %c %message %n" /> 
    <Filters> 

     <!-- First deny error and fatal messages --> 
     <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> 
     <ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL"/> 

     <!-- Then accept info, warn, error, fatal and deny debug/trace --> 
     <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="NEUTRAL"/> 
     <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 
    </Filters> 
</Console> 
+0

我們可以在log4j2中直接放置appender-ref嗎?不要在appender內部過濾器達到相同? – Abhin 2014-09-02 09:50:36

+0

很久以前,https://issues.apache.org/jira/browse/LOG4J2-60增加了Appender-ref對關卡的支持。你可以看到這是一個簡短的符號,用於將過濾器放入appender配置元素中。 – 2014-09-03 01:42:07

+0

哦,好的。感謝remko。 – Abhin 2014-09-03 09:05:59

3

使用過濾器。

這裏的一切都輸出到C:/Logs/Log.log的配置,另外輸出調試只C:/Logs/Debug.log

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"> 
    <appender name="general-out" class="org.apache.log4j.FileAppender"> 
     <param name="File" value="C:/Logs/Log.log"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1} : %m%n"/> 
     </layout> 
    </appender> 

    <appender name="debug-out" class="org.apache.log4j.FileAppender"> 
     <param name="File" value="C:/Logs/Debug.log"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1} : %m%n"/> 
     </layout> 
     <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
      <param name="LevelToMatch" value="debug"/> 
      <param name="AcceptOnMatch" value="true"/> 
     </filter>  
     <filter class="org.apache.log4j.varia.DenyAllFilter"/> 
    </appender> 

    <root> 
     <appender-ref ref="debug-out" /> 
     <appender-ref ref="general-out" /> 
    </root> 
</log4j:configuration> 

這裏的關鍵部分是這樣的:

<filter class="org.apache.log4j.varia.LevelMatchFilter"> 
    <param name="LevelToMatch" value="debug"/> 
    <param name="AcceptOnMatch" value="true"/> 
</filter>  
<filter class="org.apache.log4j.varia.DenyAllFilter"/> 

這樣的事情記錄與debug ,然後否認其他任何東西。

來源:http://wiki.apache.org/logging-log4j/LogByLevel

+0

謝謝,Pokechu22 。這很有幫助,雖然我真的在尋找log4j2配置。 – andersonbd1 2014-09-02 12:41:06

2

由於您使用Log4j 2,您可能需要使用一個ThresholdFilter。使用此過濾器,您的配置文件可能如下:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Appenders> 
    <File name="appFile" fileName="logs/appFile.log" append="true"> 
     <PatternLayout pattern="%d %-5p (%c.java:%L).%M - %m%n" /> 
     <ThresholdFilter level="DEBUG" /> 
    </File> 
    <File name="errorFile" fileName="logs/errorFile.log" append="true"> 
     <PatternLayout pattern="%d %-5p (%c.java:%L).%M - %m%n" /> 
     <ThresholdFilter level="ERROR" /> 
    </File> 
    </Appenders> 
    <Loggers> 
    <Logger name="us.benanderson" level="debug"> 
     <AppenderRef ref="appFile" /> 
    </Logger> 
    <Root level="error"> 
     <AppenderRef ref="errorFile" /> 
    </Root> 
    </Loggers> 
</Configuration> 
+0

謝謝,保羅。如果我沒有得到一個更徹底的答案,我肯定會接受這個答案。 – andersonbd1 2014-09-02 12:40:02

1

根據您的要求;不應該配置爲如下(有註釋): -

<Loggers> 
    <!-- Do not trickle down 'debug' logs to parent logger using additivity as false; keeping them only in appFile --> 
    <Logger name="us.benanderson" level="debug" additivity="false"> 
      <AppenderRef ref="appFile" /> 
    </Logger> 
    <!-- Error messages by default go to both appfile and errorFile --> 
    <Root level="error"> 
      <AppenderRef ref="errorFile" /> 
     <AppenderRef ref="appFile" /> 
    </Root> 
</Loggers> 

如果你特別擔心來自「us.benanderson」包錯誤日誌;你可以嘗試有一個單獨的記錄器'錯誤'級別。因此,配置看起來像: -

<Loggers> 
    <Logger name="us.benanderson" level="debug" additivity="false"> 
     <AppenderRef ref="appFile" /> 
    </Logger> 
    <!-- Not specifying additivity here would default to 'true'; hence the error logs would also be relayed to the root/errorFile --> 
    <Logger name="us.benanderson" level="error"> 
     <AppenderRef ref="appFile" /> 
    </Logger> 
    <Root level="error"> 
     <AppenderRef ref="errorFile" /> 
    </Root> 
</Loggers> 
+0

謝謝,阿賓。如果我沒有得到更徹底的答案,我會接受這個答案。 – andersonbd1 2014-09-02 12:40:33

+0

不要提及:-)。無論如何解決你的問題。那麼appenderRef上的'水平'是否可行? – Abhin 2014-09-02 14:37:28

+0

是的 - 它的工作原理。 – andersonbd1 2014-09-04 15:50:56