Spring boot Netty或任何其他非阻塞IO服务器上的Logback MDC
Logback MDC(映射诊断上下文)正在利用threadLocal(据我所知),以便在同一线程执行的所有日志语句上都可以访问它 我的问题是,logback MDC是否会在非阻塞IO服务器端运行时(如Netty或Undertow)中工作,就像它在tomcat中工作一样? 如果是,它是如何工作的,因为Netty/Undertow不像tomcat那样每个请求都遵循一个线程Spring boot Netty或任何其他非阻塞IO服务器上的Logback MDC,spring-boot,netty,logback,mdc,distributed-tracing,Spring Boot,Netty,Logback,Mdc,Distributed Tracing,Logback MDC(映射诊断上下文)正在利用threadLocal(据我所知),以便在同一线程执行的所有日志语句上都可以访问它 我的问题是,logback MDC是否会在非阻塞IO服务器端运行时(如Netty或Undertow)中工作,就像它在tomcat中工作一样? 如果是,它是如何工作的,因为Netty/Undertow不像tomcat那样每个请求都遵循一个线程 我试图在MDC中放置一个traceID,这样我就可以在一个集中式日志记录系统(如Splunk/ELK)中跨多个微服务/管道侦听
我试图在MDC中放置一个traceID,这样我就可以在一个集中式日志记录系统(如Splunk/ELK)中跨多个微服务/管道侦听器从一个事务跟踪跟踪所有日志,我对直接使用netty不太熟悉,但我知道可以使用带有异步代码的logback MDC。但这并不容易 基本上,您需要以某种方式将traceId绑定到请求/连接,并且每次开始处理该连接时,在MDC中为当前线程设置traceId 如果您使用的是线程池,则可以使用自定义执行器执行此操作,该执行器从当前线程本地存储中获取当前状态(例如traceId),并创建一个包装的可运行或可调用线程池,将线程本地存储设置为运行之前检索到的值。然后将包装好的runnable转发给委托执行器 您可以在此处看到这是如何完成的:
事实上,根据您的需要,您可能可以使用java线程上下文项目。正如您所提到的,MDC实现基于
ThreadLocal
,因此它并不真正适用于反应器
对于反应堆(我假设您是通过标签使用它),我的建议是:
Mono
和Flux
中的Context
存储执行期间可用的traceId
tradeId
并将其添加到上下文中的一个位置,那么您可以使用WebFilter
来完成此操作
上下文中的数据
这称为传播线程池,这就是我们如何在池中的所有线程上实现mdc的方法。