我很困惑为什么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语句,这是我没想到的。
有人可以解释发生了什么吗?
答案 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”的祖先。这个命名方案应该是 大多数开发人员都很熟悉。
根记录器位于记录器层次结构的顶部。它有两种方式:
- 它始终存在,
- 无法通过名称检索。
醇>附加功能和布局
将转发给定记录器的每个启用的日志记录请求 该记录器中的所有appender以及更高的appenders 层次结构。例如,如果将控制台appender添加到 根记录器,然后所有启用的记录请求将至少打印 控制台。
如果另外将文件追加器添加到记录器,比如C,那么 已启用的C和C子项的日志记录请求将打印在文件上 并在控制台上。可以覆盖此默认行为 通过设置,使得appender积累不再是累加的 additivity标志为false。
答案 1 :(得分:1)
阈值是分层的。 DEBUG包括所有INFO,WARN,ERROR。因此,如果您定义具有DEBUG阈值的控制台,它将接收INFO级别消息是很自然的。
如果您只希望控制台接收WARN和ERROR,请将其阈值设置为WARN。