SLF4J MDC:数据"出血"从子线程到父线程

时间:2018-04-03 14:45:22

标签: spring-mvc aop slf4j mdc

我有一个Spring MVC应用程序,它使用SLF4J设置了日志记录。我使用两个不同的方面(使用spring-aop)进行日志记录,一个用于记录所有传入的http请求,另一个用于记录异步任务。使用ExecutorService启动异步任务。

我的理解是,当您使用ExecutorService时,衍生线程的MDC将 继承已设置的值。但似乎确实如此。很公平。我只是在我的子线程中调用org.slf4j.MDC.clear()来重置值。

我的问题是我在衍生子线程中​​设置的值 显示在原始 线程的MDC。

这是正常的,还是我做错了什么?有什么方法可以阻止这种情况吗?

1 个答案:

答案 0 :(得分:0)

很抱歉没有发布代码。我认为我的问题更多的是一般性的“这个应该正在发生吗?”有点问题。但显然,代码总是有帮助的。

Fyi,我在SL4J下使用Log4j。

无论如何,我发现了我的问题。它与MDC没有任何关系,而且与在测试模式下,我们重写ThreadPoolTask​​Executor的execute()方法这一事实有关,所以事实上它确实 < / strong>开始一个新线程。我不知道。显然这是完成的,因为否则测试会有交易问题。这解释了为什么我有“数据流失”问题。

所以这是我的问题,而不是MDC。我已经确认,备份MDC的HashTable对于http请求和异步任务都是相同的实例。所以看起来我已经坚持了下来。 :(

无论如何,谢谢你的回应。