Log4j2 - 使用编程配置在AwaitCompletionReliabilityStrategy上的Stackoverflow

时间:2017-11-29 07:41:46

标签: java spring log4j2

我当前的项目需要使用Spring上下文中的属性更新log4j2配置。为了实现这一点,我已经完成了一个监听器,它在加载spring上下文时(在EnvironmentChangeEvent上)重新加载log4j2上下文。侦听器正常工作,第一次使用我的配置加载上下文。但是,当完成刷新时,在这种情况下通过/ refresh端点,应用程序在log4j2的AwaitCompletionReliabilityStrategy中抛出Stackoverflow错误。

错误在这两行中出现:

@Test
public void testAwaitCompletionStackOverflow() {
    Logger log = LogManager.getLogger(this.getClass());
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    final Configuration config = ctx.getConfiguration();
    PatternLayout layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, null, config, null,
        null,false, false, null, null);
    Appender appender = FileAppender.createAppender("target/test.log", "false", "false", "File", "true",
        "false", "false", "4000", layout, null, "false", null, config);
    appender.start();
    config.addAppender(appender);
    AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);
    AppenderRef[] refs = new AppenderRef[] {ref};
    LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.INFO, "testlog4j2refresh",
        "true", refs, null, config, null );
    loggerConfig.addAppender(appender, null, null);
    config.addLogger("testlog4j2refresh", loggerConfig);
    ctx.stop();
    ctx.start(config);

    log.error("Info message");
}

该错误与Spring Boot无关,因为我已经完成了一个junit测试,只用Log4j2类复制错误:

{{1}}

我在log4j2 JIRA https://issues.apache.org/jira/browse/LOG4J2-2134填写了一个问题,但在此期间必须为此问题寻找解决方案或解决方法。

实际上我的解决方案是创建了一个小补丁,检查AwaitCompletionReliabilityStrategy,如果“下一个”结果等于实际结果并返回实际结果,但我认为用修补程序在生产中部署微服务是不行的log4j2库。

还有其他方法可以解决这个问题吗?或者是以编程方式加载log4j配置的其他方法吗?

提前致谢!