我当前的项目需要使用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配置的其他方法吗?
提前致谢!