Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Netty或任何其他非阻塞IO服务器上的Logback MDC_Spring Boot_Netty_Logback_Mdc_Distributed Tracing - Fatal编程技术网

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

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)中跨多个微服务/管道侦听

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

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


我试图在MDC中放置一个traceID,这样我就可以在一个集中式日志记录系统(如Splunk/ELK)中跨多个微服务/管道侦听器从一个事务跟踪跟踪所有日志,我对直接使用netty不太熟悉,但我知道可以使用带有异步代码的logback MDC。但这并不容易

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

如果您使用的是线程池,则可以使用自定义执行器执行此操作,该执行器从当前线程本地存储中获取当前状态(例如traceId),并创建一个包装的可运行或可调用线程池,将线程本地存储设置为运行之前检索到的值。然后将包装好的runnable转发给委托执行器

您可以在此处看到这是如何完成的:


事实上,根据您的需要,您可能可以使用java线程上下文项目。

正如您所提到的,MDC实现基于
ThreadLocal
,因此它并不真正适用于反应器

对于反应堆(我假设您是通过标签使用它),我的建议是:

  • 使用
    Mono
    Flux
    中的
    Context
    存储执行期间可用的
    traceId

  • 如果您正在使用SpringWebFlux,并且希望生成
    tradeId
    并将其添加到
    上下文中的一个位置,那么您可以使用
    WebFilter
    来完成此操作

  • 然后,您可以使用一些自定义命令从上下文检索数据 帮助器方法,如,或创建您自己的自定义日志记录格式,您可以在其中使用
    上下文中的数据

  • 这称为传播线程池,这就是我们如何在池中的所有线程上实现mdc的方法。