Log4J2日志级别优先级



我有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标签中定义的级别应该是最高的

您应该花点时间阅读关于log4j2架构的log4j2手册。特别是"LoggerConfig"one_answers"Appender"部分。

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

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

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

这就引出了你关于优先权的问题。答案是记录器的级别优先于附加程序的级别。如果该消息被记录器拒绝,它将永远不会到达该记录器的附加程序。如果记录器接受了消息,则如果appender的级别比消息级别更具体,则它仍然可以被appender拒绝。棘手的部分是,当可加性是true(默认情况下是这样(时,祖先记录器的附加器将被视为子记录器的附加程序,正如我上面解释的那样。

换句话说,由于TRACE是第二个最不特定的级别,您需要将记录器和appender都设置为TRACE或更低的级别(例如ALL(,以便看到这些消息出现在输出中。或者,您可以简单地将记录器设置为TRACE或更低的级别,并在appender上执行而不是设置级别。

最新更新