gpt4 book ai didi

java - MDC 值未传递给请求

转载 作者:行者123 更新时间:2023-11-28 22:42:57 25 4
gpt4 key购买 nike

我希望每个应用程序都有一个单独的日志文件,同时只使用一个 logback.xml 文件。因此我使用的是 SiftingAppender .

每个应用程序都有自己的 WebApplicationInitializer分配特定的 MDC .

当我启动我的 Tomcat 服务器时,所有日志文件都按应有的方式拆分。

但是当我向服务器发送请求时,日志输出被写入未知 文件。显然无法读取MDC值。

据我所知,MDC 值是从父线程复制到子线程的。每个请求的线程在哪里创建,以便我可以在那里分配 MDC 值?

最佳答案

虽然像 Tomcat 这样的经典 servlet 容器使用 Thread-Per-Request 模型,但您不能依赖于单个线程到单个 web 应用程序的任何映射。这是因为请求是由容器管理线程池提供服务的,例如想象一个具有 3 个线程 A、B 和 C 的线程池。这些服务请求以循环方式在两个 Web 应用程序 W1 和 W2 之间交替:

request 1 on W1 serviced by A
request 2 on W2 serviced by B
request 3 on W1 serviced by C
request 4 on W2 serviced by A
...

如您所见,线程 A 首先处理对 webapp W1 的请求,然后再用于对 webapp W2 的请求。因此,您不能一次将网络应用程序 ID 分配给线程并完成它。相反,对于每一个请求,你都必须

  • 在处理请求之前在线程 MDC 中设置 web-app id
  • 处理完成后从请求线程中删除 web-app id

这两项任务都可以通过 Servlet Filter 来完成。 . logback documentation“MDC 和托管线程” 部分中也对此进行了解释。甚至还有一个 sample filter implementation可用,您可以对其进行修改以满足您的需要。

关于java - MDC 值未传递给请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21136911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com