2012-08-30 47 views
4

我正在使用log4j进行记录。我有一个场景,我必须针对不同的严重性使用单独的日志记录。例如,对于包foo,我必须在控制台中打印严重性为ERROR的消息,而我必须在日志文件中打印严重性为WARN的消息。我怎样才能配置我的log4j.xml相同。级别的特定记录器

回答

5

您可以为您的任务使用LevelMatchFilter。此外,您不应该忘记使用另一个过滤器 - DenyAllFilter - 作为过滤器链中的最后一个过滤器。

你的log4j.xml看起来就像这样:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.SimpleLayout" /> 
     <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
      <param name="LevelToMatch" value="ERROR" /> 
      <param name="AcceptOnMatch" value="true" /> 
     </filter> 
     <filter class="org.apache.log4j.varia.DenyAllFilter" />  
    </appender> 

    <appender name="fileAppender" class="org.apache.log4j.FileAppender"> 
     <param name="File" value="error.log" /> 
     <layout class="org.apache.log4j.SimpleLayout" /> 
     <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
      <param name="LevelToMatch" value="WARN" /> 
      <param name="AcceptOnMatch" value="true" /> 
     </filter> 
     <filter class="org.apache.log4j.varia.DenyAllFilter" />  
    </appender> 

    <logger name="foo"> 
     <level value="WARN" /> 
     <appender-ref ref="consoleAppender" /> 
     <appender-ref ref="fileAppender" /> 
    </logger> 
</log4j:configuration> 
+0

为什么我们应该用'DenyAllFilter'? – Tariq

+0

@Tariq简而言之:因为如果事件级别与参数LevelToMatch的值不匹配,LevelMatchFilter将保持中性。因此,要拒绝LevelMatchFilter不接受的所有事件(在我们的示例中,因为AcceptOnMatch = true),我们需要DenyAllFilter。 –