我正在与Log4J2和ThreadContext一起使用,基本上,我希望在所有线程之间共享ThreadContext (或者替代ThreadContext,因为名称似乎意味着它应该是特定于线程的)。
现在,我在我的程序参数中设置了这两个标志(虽然我认为这是第二个遗留问题):
-Dlog4j2.isThreadContextMapInheritable=true
-DisThreadContextMapInheritable=true如果当我的应用程序第一次启动时,我会:
ThreadContext.put("key", "value");父线程和子线程中的日志都将输出“值”,因此假设ThreadContext在线程之间成功共享。
但是,如果我在我的孩子运行之前更新该消息,请使用:
ThreadContext.put("key", "anotherValue");我的子线程仍然具有原始的“值”,但是父线程上的下一条消息将是"anotherValue“。
如果更新子线程中的值,也会发生同样的情况。子线程将输出"anotherValue“,但父线程仍将输出”值“。
我假设我遗漏了一些关于ThreadContext如何工作的关键内容,因为正在发生的事情对我来说没有任何意义。
发布于 2022-11-01 22:06:30
ThreadContext的文档明确声明:
MDC是在每个线程的基础上管理的。要使MDC的副本自动继承到新创建的线程,请启用"isThreadContextMapInheritable“Log4j system属性。
即使您启用了isThreadContextMapInheritable,ThreadContext也不是共享的--子线程收到一个副本,如果您更改父线程( ThreadContext )或子线程( childs ThreadContext ),它们就会分道扬镳。
log4j2手册提供了以下提示,可以帮助您实现所需的功能:
Log4j 2.7添加了一种灵活的机制,可以使用来自ThreadContext以外的其他来源的上下文数据标记日志记录语句。有关详细信息,请参阅扩展Log4j的手册页。
扩展Log4j上的手册页包含一些提示,说明您可以实现org.apache.logging.log4j.core.util.ContextDataProvider并将其注册为附加的上下文数据提供程序。
我本人没有实现这样一个ContextDataProvider的经验。
https://stackoverflow.com/questions/74281799
复制相似问题