Log4j中的级别如何工作?

时间:2012-09-08 11:35:24

标签: java logging log4j

我正在学习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!-----------------");

1 个答案:

答案 0 :(得分:1)

com.supertrooper记录器将从根记录器继承appender,因此您无需将相同的appender显式添加到子记录器。如果您这样做,就像在您的示例中那样,那么您最终会收到重复的消息。

根记录器设置为“致命”这一事实并没有改变这样一个事实,即它的appender将由子节点继承(无论它们设置的是什么日志级别)。如果您希望appender只记录致命消息而不管它们来自哪个记录器,那么您需要在 appender 本身设置一个阈值。