Log4J2日志级别优先级

时间:2018-07-19 18:21:16

标签: log4j2 configuration-files

我有log4j2.xml,其部分配置为:

<Loggers>
    <Root level="debug" includeLocation="true">
        <AppenderRef ref="FileInfo" level="info" />
        <AppenderRef ref="FileDebug" level="debug" />
    </Root>

    <Logger name="com.mycompany.domain.XYZ" level="TRACE" />
    <Logger name="com.mycompany.domain.ABC" level="TRACE" />
</Loggers>

但是,TRACE消息没有出现在两个文件附加器(FileInfo / FileDebug)中。当我将FileDebug日志级别更改为“ TRACE”时,就会出现TRACE消息。

问题 :可以在多个地方指定日志“级别”。这些级别的优先顺序是多少?我认为在Logger标签处定义的级别应该是最高的。

1 个答案:

答案 0 :(得分:0)

您应该花时间阅读log4j2 manual regarding the architecture of log4j2。特别是有关“ LoggerConfig”和“ Appender”的部分。

您描述的行为是由于您没有与com.mycompany.domain.XYZcom.mycompany.domain.ABC记录器相关联的附加程序,并且可加性的默认值为true

当消息到达com.mycompany...个记录器之一并达到TRACE级时,记录器将接受该消息并将其发送给该记录器的所有附加程序-因为这些记录器没有附加器。

接下来,由于默认情况下可加性为true,因此该消息会到达记录器层次结构中下一个祖先的附加器,在您的情况下是根目录。根记录器的级别不影响是否接受消息,因为子记录器已经接受了该消息。但是,由于您设置的附加器级别比TRACE更具体,因此该消息仍不会出现在输出中,因此附加器都拒绝该消息。

这使我想到了关于优先级的问题。答案是记录器的级别优先于附加器的级别。如果消息被记录器拒绝,它将永远不会到达该记录器的添加者。如果消息被记录器接受,但附加器的级别比消息级别更具体,附加器仍可以拒绝该消息。棘手的部分是,当可加性为true(默认情况下为默认值)时,祖先记录器的追加器被视为子记录器的追加器,如上所述。

换句话说-由于TRACE是第二个最低特定级别,因此您需要将记录器和附加程序都设置为TRACE或更低的级别(例如ALL)为了看到这些消息出现在输出中。另外,您可以简单地将记录器设置为TRACE或更低的级别,而在附加器上设置该级别。