我正在学习Log4j,我试图理解为什么它会打印两次调试信息? 我已经阅读了关于additivty的内容,并了解日志记录将传播给父级,在这种情况下,父级将是“root”。但是“root”上的级别是致命的,所以不应该过滤此日志记录请求吗?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="dataAccessLogger" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="conversionPattern" value="%m%n" />
</layout>
</appender>
<logger name="com.supertrooper">
<level value="debug" />
<appender-ref ref="dataAccessLogger" />
</logger>
<root>
<level value="fatal" />
<appender-ref ref="dataAccessLogger" />
</root>
</log4j:configuration>
代码:
// Field in class
private static Logger logger = Logger.getLogger(Log4JTesting.class);
// How I use it
logger.debug("Hello world!-----------------");
答案 0 :(得分:1)
com.supertrooper
记录器将从根记录器继承appender,因此您无需将相同的appender显式添加到子记录器。如果您这样做,就像在您的示例中那样,那么您最终会收到重复的消息。
根记录器设置为“致命”这一事实并没有改变这样一个事实,即它的appender将由子节点继承(无论它们设置的是什么日志级别)。如果您希望appender只记录致命消息而不管它们来自哪个记录器,那么您需要在 appender 本身设置一个阈值。