java - 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));
解决方案
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(); }
推荐阅读
- selenium - 远程调试 chrome - 不打开 websocket
- python-3.x - 对字典值求和,使用两个键作为索引:如何实现这一点?
- python - 嵌套字典从键中查找特定值
- c++ - 使用 clang 将 std lib 作为模块导入
- algorithm - 插入排序时间复杂度
- plugins - TFS 2013 工作项更改事件侦听器不起作用
- arrays - 如何将三角形的点值存储在点数组中以便之后对其进行排序?
- ruby-on-rails - Sidekiq 抛出 Redis::CommandError
- android - java.lang.NullPointerException:null 不能转换为非 null 类型 com.example.kalugaguide.Item
- css - 使用 CSS 匹配 HTML 表格数据文本