繁体   English   中英

我们如何让主线程等待异步日志记录完成(或其他方式)

[英]How can we make main thread to wait until asynchronous logging is finished (or other way around)

我正在尝试使用 log4j2 以编程方式创建异步记录器。

它在特定点之前工作正常,但之后它会出现以下错误:

2019-12-25 13:36:15,503 Log4j2-TF-1-AsyncLogger[AsyncContext@659e0bfd]-1 ERROR Attempted to append to non-started appender consoleAppender

此外,因此只打印部分日志。 我的意思是如果总共要打印 1000 条日志,则只打印 800 条。

示例代码如下:

public void log() {

    final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
    config = builder.build();
    ctx = Configurator.initialize(config);
    config = ctx.getConfiguration();
    ctx.start(config);
    ctx.updateLoggers();
    logger = ctx.getLogger(loggerName);
    logger.addAppender(attachConsoleAppender(ctx.getConfiguration(), appenderName));
    while (counter < 2000) {
        logger.error(testMessage + counter);
        counter++;
    }
    closeLogger();
}

private Appender attachConsoleAppender(Configuration config, String appenderName) {
    Appender consoleAppender = ConsoleAppender.newBuilder().setConfiguration(config).setName(appenderName)
            .withImmediateFlush(true).build();
    consoleAppender.start();
    return consoleAppender;
}

public void closeLogger() {

    config.getLoggerConfig(loggerName).getAppenders().get(appenderName).stop();
    config.getLoggerConfig(loggerName).removeAppender(appenderName);
    config.removeLogger(loggerName);
    ctx.updateLoggers();
    }
}

我认为的问题是异步记录器在与主线程不同的线程中运行。

我删除记录器的逻辑是同步执行的,它首先执行,这导致关闭附加程序并删除记录器,而日志记录仍未在另一个线程中完成。

我浏览了多个链接,但没有得到太多帮助:

Log4j2 自定义附加程序:错误尝试附加到未启动的附加程序

log4j:ERROR 试图附加到名为 [..] 的已关闭附加程序

log4j: log4j:ERROR 尝试附加到名为 [stdout] 的已关闭附加程序

https://issues.apache.org/jira/browse/LOG4J2-927

有没有什么办法可以处理这种情况,还是等待主线程直到日志记录完成还是即使主线程完成也记录消息是好的。我们如何实现它。

PS:上面的代码只是可以复制问题的示例

我在 log4j2.component.properties 中获得了具有以下属性的异步记录器: Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

我可以看到您已经添加了所有全局变量,当线程执行 closeLogger() 函数时,它正在从 loggerconfig 中删除附加程序,这使得后续线程无法写入日志。

您在删除 appender 之前检查活动线程,希望这会有所帮助。

替换您的 closeLogger() 方法或在org.apache.logging.log4j.LogManager.shutdown()之前添加此调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM