如何实现跨线程传播 MDC 日志追踪 ID 的 ThreadPoolExecutor 装饰器?
- 内容介绍
- 相关推荐
本文共计907个文字,预计阅读时间需要4分钟。
Logback 或 Log4j2 的 MDC(Mapped Diagnostic Context,映射诊断上下文)本质是基于 ThreadLocal 实现的。每个线程拥有独立的 MDC Map,子线程不会自动继承父线程的 MDC 内容。当使用 ThreadPoolExecutor 提交任务时,任务通常会被调度到其他工作线程执行,而原调用线程的 MDC 无法直接传递过去,这会导致日志中缺少 traceId、userId 等关键跟踪字段。
核心思路:任务提交时捕获 + 执行前还原
要实现跨线程透传,需在任务提交时刻“快照”当前线程的 MDC 内容,并在目标线程执行任务前将其还原。
本文共计907个文字,预计阅读时间需要4分钟。
Logback 或 Log4j2 的 MDC(Mapped Diagnostic Context,映射诊断上下文)本质是基于 ThreadLocal 实现的。每个线程拥有独立的 MDC Map,子线程不会自动继承父线程的 MDC 内容。当使用 ThreadPoolExecutor 提交任务时,任务通常会被调度到其他工作线程执行,而原调用线程的 MDC 无法直接传递过去,这会导致日志中缺少 traceId、userId 等关键跟踪字段。
核心思路:任务提交时捕获 + 执行前还原
要实现跨线程透传,需在任务提交时刻“快照”当前线程的 MDC 内容,并在目标线程执行任务前将其还原。

