【问题标题】:SLF4J MDC: Data "bleeding" from child thread to parent threadSLF4J MDC:数据从子线程“流血”到父线程
【发布时间】:2018-04-03 14:45:22
【问题描述】:

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

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

我的问题是我在生成的子线程中设置的值显示在原始父级中strong> 线程的 MDC。

这是正常的,还是我做错了什么?有什么办法可以预防吗?

【问题讨论】:

  • 您是否非常介意分享一些代码,最好是MCVE?这是 StackOverflow。谢谢你。另一个问题:您在 SLF4J 下使用哪种日志记录框架。 Logback 还是 Log4J?顺便说一句,我修正了你的错字,你在主题和正文中写了“sl4j”。现在也许 SLF4J 专家更容易找到您的问题。

标签: spring-mvc aop slf4j mdc


【解决方案1】:

很抱歉没有发布代码。我认为我的问题更多的是笼统的“这应该会发生吗?”一种问题。但显然,代码总是有帮助的。

仅供参考,我在 SL4J 下使用 Log4j。

无论如何,我发现了我的问题。它与 MDC 没有任何关系,而与在测试模式下我们正在覆盖 ThreadPoolTask​​Executor 的 execute() 方法这一事实有关,因此实际上它确实不是 开始一个新线程。我不知道。显然这是因为否则测试会出现事务问题。这就解释了为什么我遇到“数据泄露”问题。

所以这是我的问题,而不是 MDC 的问题。我已经确认,备份 MDC 的 HashTable 是 http 请求和异步任务的同一个实例。所以看起来我被它困住了。 :(

无论如何,感谢您的回复。

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 2020-05-23
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多