Netty 或任何其他非阻塞 IO 服务器上的 Logback MDC

so-*_*ude 3 logback mdc netty spring-boot distributed-tracing

Logback MDC(映射诊断上下文)正在利用 threadLocal(据我所知),以便可以在同一线程执行的所有日志语句上访问它。

我的问题是,logback MDC 是否可以在非阻塞 IO 服务器端运行时(如 Netty 或 Undertow)中工作,因为它曾经在例如 tomcat 中工作?如果是,它是如何工作的,因为 Netty/Undertow 不像 tomcat 那样遵循每个请求一个线程。

我正在尝试在 MDC 中放置一个 traceID,以便我可以在 Splunk/ELK 等集中式日志记录系统中跨多个微服务/管道侦听器的一个事务跟踪中跟踪我的所有日​​志

Tha*_*yne 5

我对直接使用 netty 不是很熟悉,但我知道可以将 logback MDC 与异步代码一起使用。不过也不容易。

基本上,您需要以某种方式将 traceId 与请求/连接联系起来,并且每次开始处理该连接时,请在 MDC 中为当前线程设置 traceId。

如果您正在使用线程池,您可以使用自定义 Executor 从当前线程本地存储获取当前状态(例如 traceId),并创建一个包装的 Runnable 或 Callable,将线程本地存储设置为先前检索的值在运行之前。然后将包装好的 runnable 转发给委托 Executor。

你可以在这里看到这是如何完成的:https : //github.com/lucidsoftware/java-thread-context/blob/master/thread-context/src/main/java/com/github/threadcontext/PropagatingExecutorService.java

事实上,根据您的需要,您或许可以使用该 java-thread-context 项目。