我当前的项目需要使用Spring上下文中的属性更新log4j2配置。为了实现这一点,我做了一个侦听器,在加载spring上下文(在EnvironmentChangeEvent上)时重新加载log4j2上下文。侦听器正常工作,并且在第一次使用我的配置加载上下文时。但是当刷新完成时,在这种情况下,通过/refreshendpoint,应用程序在log4j2的waitCompletionReliabilityStrategy中抛出Stackoverflow错误。
错误出现在这两行:
result = next.get();
return result.getReliabilityStrategy().getActiveLoggerConfig(next);
这个错误与Spring Boot无关,因为我已经做了一个jUnit测试,它只用Log4j2类复制这个错误:
@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");
}
我在log4j2 JIRA上填写了一个问题https://issues.apache.org/jira/browse/LOG4J2-2134但与此同时,我们必须为这个问题寻找解决方案或解决办法。
实际上,我的解决方案是创建一个小补丁,在AwaitCompletionReliabilityStrategy检查“下一步”结果是否等于实际结果,并在这种情况下返回实际结果,但我认为在生产中部署带有补丁log4j2库的微服务是不合适的。
还有其他办法解决这个问题吗?或者是否有其他方式以编程方式加载log4j的配置?
提前感谢!
错误已成功修复:
https://issues.apache.org/jira/browse/LOG4J2-2134?page=com.atlassian.jira.plugin.system.issuetabpanels:评论-标签面板
问题内容: 我在Ruby中使用它来循环运行一系列命令行命令。然后,我需要在循环外部运行另一个命令。直到循环中的所有命令都终止后,循环外部的命令才能运行。 我如何使程序等待这种情况发生?目前,最终命令运行得太早。 一个例子: 因此,在运行之前所有需要返回的内容。 问题答案: 我认为您需要将循环内调用的结果分配给变量,并继续调用它们,直到所有变量变为真为止。 然后,您知道所有程序都已完成执行,就可以开
我要做的是异步计算树结构的深度,我将有树的第一层,我想启动一个异步线程来分别计算每个节点的深度。 在计算过程中,树中显然可能有一个分叉,在这一点上,我想踢一个额外的线程来计算那个分支。 我已经得到了这个工作,但我需要做一些整理逻辑,当所有这些未来完成。但我对这一过程中产生的额外的可完成的未来感到困扰。 我会用什么方法来保存所有开始的CompletableFutures+那些动态创建的,并且在执行任
问题内容: 问题描述 : - 步骤1: 在主线程中从用户那里获取输入FILE_NAME。 步骤2: 对该文件执行10个操作(即,计数字符,计数行等。),所有这10个操作必须位于单独的线程中。这意味着必须有10个子线程。 步骤3: 主线程等待,直到所有那些子线程完成。 步骤4: 打印结果。 我做了什么 :- 我用3个线程做了一个示例代码。 我不希望您遇到文件操作代码。 问题:- 我上面的代码没有给出
我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,
我正在尝试将基于时间的触发策略与log4j-2.13一起使用。2,它与spring boot 2.3一起嵌入。0.0释放(spring-boot-started-log4j2)。预期的功能是每天创建一个日志文件。 我的配置文件如下所示: 但是,在启动应用程序时,会引发以下异常: 如果我改变文件模式: 不再引发异常,但文件名为“log-%d{yyyyMMdd}.log”,而不是“log-202005
我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?