【问题标题】:Log4J2 Log Level precedenceLog4J2 日志级别优先级
【发布时间】:2018-07-19 18:21:15
【问题描述】:

我有部分配置为的 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 configuration-files


    【解决方案1】:

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

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

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

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

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

    换句话说 - 因为TRACE 是第二个最不具体的级别,您需要将记录器和附加程序都设置为TRACE 或更低的级别(例如ALL)才能看到这些消息出现在输出中。或者,您可以简单地将您的 logger 设置为 TRACE 或更低的级别,然后在 appender 上设置级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多