首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自子线程的Log4j ThreadContext

来自子线程的Log4j ThreadContext
EN

Stack Overflow用户
提问于 2022-11-01 21:06:58
回答 1查看 53关注 0票数 0

我正在与Log4J2和ThreadContext一起使用,基本上,我希望在所有线程之间共享ThreadContext (或者替代ThreadContext,因为名称似乎意味着它应该是特定于线程的)。

现在,我在我的程序参数中设置了这两个标志(虽然我认为这是第二个遗留问题):

代码语言:javascript
复制
-Dlog4j2.isThreadContextMapInheritable=true
-DisThreadContextMapInheritable=true

如果当我的应用程序第一次启动时,我会:

代码语言:javascript
复制
ThreadContext.put("key", "value");

父线程和子线程中的日志都将输出“值”,因此假设ThreadContext在线程之间成功共享。

但是,如果我在我的孩子运行之前更新该消息,请使用:

代码语言:javascript
复制
ThreadContext.put("key", "anotherValue");

我的子线程仍然具有原始的“值”,但是父线程上的下一条消息将是"anotherValue“。

如果更新子线程中的值,也会发生同样的情况。子线程将输出"anotherValue“,但父线程仍将输出”值“。

我假设我遗漏了一些关于ThreadContext如何工作的关键内容,因为正在发生的事情对我来说没有任何意义。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的经验。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74281799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档