当前位置: 首页 > 知识库问答 >
问题:

log4j2根记录器覆盖所有内容?

公冶渝
2023-03-14

我对log4j2比较陌生。当前,我有以下配置文件:

<?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>

如果我通过静态记录器在这两个类Consoleain和ClientMain中记录一些东西

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

而且

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

他们总是使用根记录器的附加器和级别。如果根记录器的级别是“错误”,那么它永远不会显示任何调试级别的日志输出,即使单个记录器的级别是调试。而且,它总是追加到根记录器中指定的日志文件,而不是类的记录器中指定的日志文件。

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

我试着删除根的附加符,但是它没有记录任何东西。

谢谢!

共有1个答案

伍成仁
2023-03-14

我试过你的设置,但我不能复制这个问题。下面是我使用的代码:

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

这是意料之中的行为。重复条目是正常的,因为默认情况下,可加性在log4j中为真,所以根记录器和命名记录器都将记录相同的消息(请参见http://logging.apache.org/log4j/2.x/manual/configuration.html#additivility)。我没有看到您报告的问题,即当根级别为“错误”时,调试级别的消息从未出现在日志文件中。

也许是别的事情在发生。您使用的log4j2是什么版本(最近的版本是beta9)?您是否也可以尝试用上面最小的示例代码来重现这个问题,看看这个问题是否仍然发生?

 类似资料:
  • 我有一个maven项目,它使用log4j2进行日志记录。我想覆盖RootLogger的模式。 这是我的log4j2。属性文件: 这是我的pom。log4j的xml文件: 我这样叫我的记录仪: 我的配置有两个问题。第一个是根记录器不使用我的ConsolePender(警告等以默认格式显示),在记录错误时,我只得到第一行,而不是整个堆栈跟踪)。

  • 我仍然没有发现正在发生的事情,但以下是我目前发现并做的事情: 1)log4j.xml文件格式不正确:缺少DOCTYPE,有多个布局,某些布局类不正确。 2)我已在命令行中指定了log4j.xml文件的路径;3)对DOMConfigurator和PropertyConfigurator的几次调用,我已将它们删除。 我将研究范围缩小到一个基于线程ID创建动态日志文件的类。在执行该类中的代码之前,log

  • 我找过了,但什么也没找到。我有一个实体类,如下所示: 在application.properties中,我有以下配置: 我们将感谢您的帮助

  • 我正在使用2个appender-控制台和自定义appender,称为MyAppender,它应该忽略所有级别低于ERROR的消息(也就是说,它应该只支持ERROR和FATAL)。控制台应该能够支持所有级别。我尝试了几种方法来定义它,但似乎过滤器不适用于根级附加器。如何实现这一点?我当前的log4j2定义:

  • 问题内容: 我正在尝试将其所有内容(及其内容等)复制到python中。此外,我希望副本覆盖中的所有内容。 它 看起来 像可能是这个职位的合适的工具,但不能肯定是否有什么更容易/更明显,使用这样一个简单的任务。 如果它是正确的工具,该如何使用?根据文档,它需要8个参数。我是否必须通过所有8个just ,和,如果是,则通过(我是Python的新手)。 如果有更好的东西,有人可以给我一个例子,指出正确的

  • 问题内容: 我使用了tomcat,并简单地覆盖了默认的日志系统。如何在我的Spring应用程序中启用Wildfly上的Logback日志记录? 我在tomcat上的Logback.xml 问题答案: 您可以使用logback来配置应用程序中的日志记录。您不能使用logback为服务器配置日志记录。 要在配置中使用logback,您需要将更改为false或创建一个不包含子系统的。您还需要在部署中包括