帮助我了解log4j appender在优先级方面的可加性

时间:2011-04-06 19:31:52

标签: log4j

我很困惑为什么INFO语句会进入控制台。以下是一般设置:

<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和WARN语句以及上面的语句进行REST_LOG和CONSOLE。我所看到的是REST_LOG中xyz.web.rest的INFO语句如预期的那样,但也看到了CONSOLE中xyz.web.rest的INFO语句,这是我没想到的。

有人可以解释发生了什么吗?

2 个答案:

答案 0 :(得分:4)

您应该在xyz.web.rest记录器上将加性设置为false。

       

如果没有可加性,您将在控制台中看到用logger INFO两次记录的所有xyz.web.rest消息,因为记录器继承了Root logger的追加器 以及xyz.web记录器。

请参阅Log4j文档的Appenders and Layouts部分

  

命名层次结构
  记录器据说是另一个记录器的祖先   如果其后跟一个点的名称是后代记录器的前缀   名称。如果存在,则记录器被称为子记录器的父节点   它本身和后代记录器之间没有祖先。

     

例如,名为“com.foo”的记录器是记录器的父级   名为“com.foo.Bar”。同样,“java”是“java.util”的父级   “java.util.Vector”的祖先。这个命名方案应该是   大多数开发人员都很熟悉。

     

根记录器位于记录器层次结构的顶部。它有两种方式:

     
      
  1. 它始终存在,
  2.   
  3. 无法通过名称检索。
  4.         

    附加功能和布局

         

    将转发给定记录器的每个启用的日志记录请求   该记录器中的所有appender以及更高的appenders   层次结构。例如,如果将控制台appender添加到   根记录器,然后所有启用的记录请求将至少打印   控制台。

         

    如果另外将文件追加器添加到记录器,比如C,那么   已启用的C和C子项的日志记录请求将打印在文件上   并在控制台上。可以覆盖此默认行为   通过设置,使得appender积累不再是累加的   additivity标志为false。

答案 1 :(得分:1)

阈值是分层的。 DEBUG包括所有INFO,WARN,ERROR。因此,如果您定义具有DEBUG阈值的控制台,它将接收INFO级别消息是很自然的。

如果您只希望控制台接收WARN和ERROR,请将其阈值设置为WARN。