我有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标签处定义的级别应该是最高的。
答案 0 :(得分:0)
您应该花时间阅读log4j2 manual regarding the architecture of log4j2。特别是有关“ LoggerConfig”和“ Appender”的部分。
您描述的行为是由于您没有与com.mycompany.domain.XYZ
和com.mycompany.domain.ABC
记录器相关联的附加程序,并且可加性的默认值为true
。
当消息到达com.mycompany...
个记录器之一并达到TRACE
级时,记录器将接受该消息并将其发送给该记录器的所有附加程序-无因为这些记录器没有附加器。
接下来,由于默认情况下可加性为true
,因此该消息会到达记录器层次结构中下一个祖先的附加器,在您的情况下是根目录。根记录器的级别不影响是否接受消息,因为子记录器已经接受了该消息。但是,由于您设置的附加器级别比TRACE
更具体,因此该消息仍不会出现在输出中,因此附加器都拒绝该消息。
这使我想到了关于优先级的问题。答案是记录器的级别优先于附加器的级别。如果消息被记录器拒绝,它将永远不会到达该记录器的添加者。如果消息被记录器接受,但附加器的级别比消息级别更具体,附加器仍可以拒绝该消息。棘手的部分是,当可加性为true
(默认情况下为默认值)时,祖先记录器的追加器被视为子记录器的追加器,如上所述。
换句话说-由于TRACE
是第二个最低特定级别,因此您需要将记录器和附加程序都设置为TRACE
或更低的级别(例如ALL
)为了看到这些消息出现在输出中。另外,您可以简单地将记录器设置为TRACE
或更低的级别,而不在附加器上设置该级别。