当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud Sleuth如何在box的Webflux ouf中传播MDC上下文,以便可以在不同的线程中记录其内容?

山疏珂
2023-03-14
@Slf4j
@RequiredArgsConstructor
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ReactiveRequestCorrelationFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        String principal = exchange.getRequest().getHeaders().getFirst("principal-header");
        MDC.put("principal", principal);
        return chain.filter(exchange)
                .subscriberContext(Context.of("principal", principal))
                .doOnTerminate(MDC::clear);
    }

}
    @GetMapping(value = "/v1/departments", produces = MediaType.APPLICATION_JSON_VALUE)
    public Flux<Department> getDepartments() {
        log.info("getDepartaments");
        return webClient.get().uri("http://someService:8080/api/v1/departamentosFoo").retrieve().bodyToFlux(Departments.class)
                .doOnNext(dep -> log.info("found department {}", dep));
    }
logging.pattern.console="%magenta([%thread]) [%X{traceId}] [%X{spanId}] [%X{principal}]  - %m%n"
[boundedElastic-2] [d0a916db8be0cbf7] [d0a916db8be0cbf7] []  - getDepartments
[boundedElastic-2] [d0a916db8be0cbf7] [fb2367685db70201] []  - found department Department(id=1, nombre=dep, fechaAlta=Fri Apr 24 14:16:20 CEST 2020, staff=1, tag=, empresa=true)
[reactor-http-nio-3] [d0a916db8be0cbf7] [d0a916db8be0cbf7] []  - found department Department(id=1, nombre=dep, fechaAlta=Fri Apr 24 14:16:20 CEST 2020, staff=1, tag=, empresa=true)

共有1个答案

曹铭晨
2023-03-14

他们使用Reactor上下文和Reactor挂钩。spring-cloud-sleuth的相关代码:link update:注意对此有相当多的更改,请务必查看上面链接指向旧提交的最新实现。

其他几个可能有用的链接:

  • WebMVC中带有WebClient的MDC
  • 如何在reactive Spring应用程序中使用MDC上下文
  • MDCContextLifter
 类似资料:
  • 问题内容: 我有一个JAVA类,用于启动具有唯一ID的各种线程。每个线程应登录到一个唯一的日志文件中,该文件以ID.log命名。 因为我仅在运行时获得唯一ID,所以我必须以编程方式配置Log4J: 现在,如果我按顺序启动作业,此方法就可以正常工作- 但是,当我同时启动2个线程(同一类)时,会创建两个日志,但日志混合在一起:第二个线程同时登录第一个和第二个日志。 我如何确保每个实例都是唯一的?我已经

  • 我对所有高级ImageJ用户和开发人员都有一个挑战。在我的宏(请参见下面的宏)中,我想插入以下任务: 我正在分析ROI中的粒子和那些接触图片边缘的粒子/对象,我想在结果表的一个特殊列中用“*”标记。也许if句子可以完成任务,但我是一个纯粹的宏初学者,真的需要一些技巧。 (我知道“在边上排除”选项,但我需要这些对象的面积来计算图像上所有面积的总和;但我需要排除它们来计算平均面积) 感谢你的帮助,杰尼

  • 问题内容: 在我们的软件中,我们广泛使用MDC来跟踪Web请求的内容,例如会话ID和用户名。在原始线程中运行时,这可以正常工作。但是,有很多事情需要在后台处理。为此,我们使用java.concurrent.ThreadPoolExecutor和java.util.Timer类以及一些自卷式异步执行服务。所有这些服务都管理自己的线程池。 这是Logback手册关于在这样的环境中使用MDC的内容: 映

  • 问题内容: 我有一个普通的INFO级别应用日志。我需要的是另外记录所有错误级别的事件,以单独的错误日志。我正在使用这样的配置: 此配置仅记录错误。如果我首先放置信息级别记录器,则它将仅记录到一般附加程序,但错误记录器将无法工作。我想让他们两个都工作。 问题答案: 您需要做的是只有一个定义了INFO级别的定义,但是在您的两个追加器定义中,您需要相应地设置其阈值,例如 然后,将两个追加程序添加到记录器

  • 现在我使用这样的结构:Appender: 记录器: 但它不适用于MDC密钥。如何使用xml中的MDC键配置RollingFileAppender?

  • 问题内容: 我是Linux内核的新手。 我知道有两个上下文 1.进程上下文,在用户空间或内核空间中运行(例如:作为系统调用的一部分) 2.中断上下文 在什么情况下运行内核线程(与ex:flush任务无关的任何用户线程)? 除了Linux内核中的Process和Interrupt上下文之外,还有其他上下文吗? 问题答案: 内核线程在内核空间中的进程上下文中运行。虽然也有一些内核线程可以处理中断。它们