2011-04-06 58 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