MDC 日志跟踪:多线程环境下的日志上下文管理
在复杂的分布式系统或多线程环境中,一条请求可能经过多个组件、线程甚至服务节点,传统日志往往难以串联整个调用链路。MDC(Mapped Diagnostic Context,映射诊断上下文)通过与线程绑定的上下文信息,为日志添加全局唯一标识(如traceId),实现跨线程、跨服务的日志追踪,是排查分布式问题的关键工具。
MDC 的核心原理
基本概念
MDC 是日志框架(Log4j、Logback、JUL)提供的线程级上下文存储机制,本质是一个与当前线程绑定的哈希表(ThreadLocal<Map<String, String>>),支持在日志中嵌入自定义键值对(如traceId、userId)。
工作机制
- 线程绑定:MDC 通过
ThreadLocal将键值对与当前线程绑定,确保同一线程内的所有日志都能访问这些上下文信息; - 日志输出:在日志格式中通过
%X{key}占位符引用 MDC 中的值(如%X{traceId}输出追踪 ID); - 自动清理:线程结束时需手动清除 MDC 内容,避免线程复用(如线程池)导致的上下文污染。
MDC 的核心 API
MDC 的 API 简单直观,主要包含以下方法(以 SLF4J 为例,不同框架方法一致):