0

我正在学习 Log4j,我试图理解为什么它会打印两次调试消息?我已阅读有关可加性的信息,并了解日志记录将传播给父级,在本例中为“根”。但是“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!-----------------");
4

1 回答 1

1

logger 将从根com.supertrooperlogger 继承 appender,因此您无需将相同的 appender 显式添加到子 logger。如果你这样做,就像你的例子一样,那么你最终会收到重复的消息。

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

于 2012-09-08T11:46:28.417 回答