首页 > 解决方案 > HttpClient sendAsync 丢失 MDC 日志信息

问题描述

我正在使用 MDC Logger,除了我使用 HttpClient 异步发送请求时,它在任何地方都能正常工作。MDC 数据没有传递到下一个线程,这意味着它们不在我们的日志中。我怎样才能让新线程拥有 MDC 标头?

 java.net.http.HttpClient.newHttpClient()
                .sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(restLogging::logResponse)
                .thenApply(response -> handleResponse(url, responseTypeClass, objectMapper, response));

标签: javacompletable-futuremdcjava-http-client

解决方案


MDC 上下文需要传播到异步方法,因为它将在不同的线程中运行。

称之为

java.net.http.HttpClient.newHttpClient()
            .sendAsync(request, HttpResponse.BodyHandlers.ofString())
            .thenApply(restLogging::logResponse)
            .thenApply(response -> handleResponse(url, responseTypeClass, objectMapper, response, MDC.getCopyOfContextMap()));

下面的实现:

handleResponse(url, responseTypeClass, objectMapper, response, Map<String,String> mdcContextMap){
MDC.setContextMap(mdcContextMap);
//your business logic
MDC.clear(); }

推荐阅读