Log4j 2 root logger会覆盖一切吗?

时间:2013-10-06 15:31:24

标签: java logging log4j log4j2

我对Log4j 2比较陌生。目前,我有这个配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <File name="DebugFile" fileName="../../logs/debug.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
    <File name="BenchmarkFile" fileName="../../logs/benchmark.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
  </Appenders>
  <Loggers> 
    <Logger name="com.messaging.main.ConsoleMain" level="debug">
      <AppenderRef ref="DebugFile"/>
    </Logger>
    <Logger name="com.messaging.main.ClientMain" level="debug">
      <AppenderRef ref="BenchmarkFile"/>
    </Logger>   
    <Root level="error">
      <AppenderRef ref="DebugFile"/>
    </Root>
  </Loggers>
</Configuration>

如果我通过静态记录器

在这两个类ConsoleMain和ClientMain中记录某些内容
    static Logger _logger = LogManager.getLogger(ClientMain.class.getName());

    static Logger _logger = LogManager.getLogger(ConsoleMain.class.getName());

他们总是使用根记录器的appender和级别。如果根记录器的级别如上所述是“错误”,则它永远不会显示任何调试级别日志记录输出,即使各个记录器的级别是调试。此外,它始终附加到根记录器中指定的日志文件,而不是类的记录器中指定的日志文件。

因此,似乎根记录器以某种方式覆盖了所有内容。如何让log4j实际使用appender和类的记录器级别?

我尝试删除root的appender,但之后它没有记录任何内容。

谢谢!

1 个答案:

答案 0 :(得分:1)

我尝试了你的设置,但我无法重现这个问题。这是我使用的代码:

package com.messaging.main;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ClientMain {
    public static void main(String[] args) throws Exception {
        Logger logger = LogManager.getLogger(ClientMain.class);
        logger.debug("debug from ClientMain");
    }
}

package com.messaging.main;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ConsoleMain {
    public static void main(String[] args) throws Exception {
        Logger logger = LogManager.getLogger(ConsoleMain.class);
        logger.debug("debug from ConsoleMain");
    }
}

当我使用您的确切配置文件运行它时,我得到以下输出:

benchmark.log:

07:59:51.070 [main] DEBUG com.messaging.main.ClientMain - debug from ClientMain

的debug.log:

07:59:51.070 [main] DEBUG com.messaging.main.ClientMain - debug from ClientMain
07:59:58.306 [main] DEBUG com.messaging.main.ConsoleMain - debug from ConsoleMain
07:59:58.306 [main] DEBUG com.messaging.main.ConsoleMain - debug from ConsoleMain

这是预期的行为。重复条目是正常的,因为默认情况下additive在log4j中为true,因此Root记录器和命名记录器都将记录相同的消息(请参阅http://logging.apache.org/log4j/2.x/manual/configuration.html#Additivity)。 我没有看到您报告的问题,当根级别为“错误”时,调试级别的消息永远不会出现在日志文件中。

也许正在发生其他事情。你使用的是什么版本的log4j2(最近的版本是beta9)?您是否也可以尝试使用上面的最小示例代码重现该问题并查看问题是否仍然存在?