java Log4j2日志未定向到正确的日志文件

f1tvaqid  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(139)

我在以编程方式配置log4j 2日志时遇到了一个问题。
请看下面的代码,我正在创建类App 3的2个对象,我想创建2个调试日志文件(每个App 3对象一个日志文件),此后每个对象都应该能够记录到相应的日志文件。
但我的代码是在创建第二个日志后将所有日志记录到第二个日志文件中。谁能帮帮忙。
程序的输出

文件名:app3_logger1.log_debug.log

2020-06-16 16:19:31,100 DEBUG app3_logger1.log [main] Hello from Log4j 2app3_logger1

文件名:app3_logger2.log_debug.log

2020-06-16 16:19:31,211 DEBUG app3_logger2.log [main] Hello from Log4j 2app3_logger2
2020-06-16 16:19:31,216 DEBUG app3_logger2.log [main] Hello from Log4j 2app3_logger2
2020-06-16 16:19:31,216 DEBUG app3_logger1.log [main] Hello from Log4j 2app3_logger1
2020-06-16 16:19:31,216 DEBUG app3_logger1.log [main] Hello from Log4j 2app3_logger1
2020-06-16 16:19:31,217 DEBUG app3_logger2.log [main] Hello from Log4j 2app3_logger2

Java类-你只需要添加log4j 2依赖来编译

public class App3 {

public Logger logger;

public static void main(String[] args) {
    App3 app1 = new App3();
    app1.initializeYourLogger("app3_logger1.log", "%d %p %c [%t] %m%n");
    app1.testProg("app3_logger1");
    App3 app2 = new App3();
    app2.initializeYourLogger("app3_logger2.log", "%d %p %c [%t] %m%n");
    app2.testProg("app3_logger2");

    app2.testProg("app3_logger2");
    app1.testProg("app3_logger1");
    app1.testProg("app3_logger1");
    app2.testProg("app3_logger2");

}

public void testProg(String s) {
    logger.debug("Hello from Log4j 2" + s);
}

public void initializeYourLogger(String fileName, String pattern) {
    this.logger = LogManager.getLogger(fileName);
    ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();

    builder.setStatusLevel(Level.DEBUG);
    builder.setConfigurationName(fileName);

    AppenderComponentBuilder componentBuilder = builder.newAppender("log", "File");
    componentBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", pattern));
    RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.DEBUG);

    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout").addAttribute("pattern", pattern);
    ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
            .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "10MB"));

    componentBuilder = builder.newAppender("LogToRollingErrorFile", "RollingFile")
            .add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.DENY)
                    .addAttribute("level", Level.ERROR))
            .addAttribute("fileName", fileName + "_error.log")
            .addAttribute("filePattern", fileName + "-%d{MM-dd-yy-HH-mm-ss}_error.log").add(layoutBuilder)
            .addComponent(triggeringPolicy);
    builder.add(componentBuilder);

    componentBuilder = builder.newAppender("LogToRollingDebugFile", "RollingFile")
            .add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.DENY)
                    .addAttribute("level", Level.DEBUG))
            .addAttribute("fileName", fileName + "_debug.log")
            .addAttribute("filePattern", fileName + "-%d{MM-dd-yy-HH-mm-ss}_debug.log").add(layoutBuilder)
            .addComponent(triggeringPolicy);
    builder.add(componentBuilder);

    AppenderRefComponentBuilder rollingError = rootLogger.getBuilder().newAppenderRef("LogToRollingErrorFile");
    AppenderRefComponentBuilder rollingDebug = rootLogger.getBuilder().newAppenderRef("LogToRollingDebugFile");
    rootLogger.add(rollingError);
    rootLogger.add(rollingDebug);
    builder.add(rootLogger);
    Configurator.reconfigure(builder.build());
}

}
这正是我想在log4j旧版本中做的,我仍然在努力使用log4j 2,

private void initLogger(String serviceName, String instance) throws IOException {
    String loggerName = serviceName+"_"+instance;
    this.logger = Logger.getLogger(loggerName);
    this.logger.removeAllAppenders();

    PatternLayout layout = new PatternLayout();
    layout.setConversionPattern("%d: %m%n");

    String loggingFolder = this.properties.getLoggingFolder();
    String debugFileName = loggingFolder+"/"+loggerName+"_debug.log";
    String errorFileName = loggingFolder+"/"+loggerName+"_error.log";

    RollingFileAppender debugAppender = new RollingFileAppender(layout, debugFileName, true);
    debugAppender.setThreshold(Level.DEBUG);
    debugAppender.setMaxFileSize("10000000");
    debugAppender.setMaxBackupIndex(49);
    logger.addAppender(debugAppender);

    RollingFileAppender errorAppender = new RollingFileAppender(layout, errorFileName, true);
    errorAppender.setThreshold(Level.ERROR);
    errorAppender.setMaxFileSize("10000000");
    errorAppender.setMaxBackupIndex(49);
    logger.addAppender(debugAppender);
}
tjjdgumg

tjjdgumg1#

实际上,我很确定您的Logger正在正确更新。问题是这两个应用程序示例将使用相同的日志记录配置。
如果查看Log4j's architecture,您将看到Logger和配置锚定在LoggerContext中。默认情况下,Log4j使用ClassLoaderContextSelector,这意味着每个ClassLoader都可以有自己的LoggerContext。您的示例应用程序只有一个ClassLoader,因此只有一个LoggerContext,因此只有一个Configuration。
因此,当您第二次重新配置时,只需将以前的配置替换为新配置。由于根日志记录器正在处理所有日志事件,因此它会将事件从您创建的两个日志记录器路由到第二个配置中创建的文件。
如果您希望日志最终出现在两个不同的文件中,那么请创建一个包含这两个文件的配置,并找出一种方法将它们路由到正确的文件,通过日志记录器名称或过滤器。

kse8i1jr

kse8i1jr2#

根据观察,您的记录器将使用上次初始化进行更新,因此在app2.initializeYourLogger()之后,您的对象级logger对象将使用App2配置进行更新。
您需要从initializeYourLogger()返回logger对象,并创建单独的Logger对象。

相关问题