一、slf4j 日志跟踪器 MDC是什么
MDC (Mapped Diagnostic Context) 是 SLF4J 提供的一个非常有用的功能,它允许开发人员在日志系统中存储上下文信息,这些信息可以在日志输出中被引用。
MDC 是什么
MDC 是一个线程安全的、基于线程的上下文存储机制,它允许你将键值对数据与当前线程关联起来。这些数据可以在日志输出时被访问,从而为日志消息添加上下文信息。
二、slf4j 日志跟踪器 MDC有什么用
-
请求跟踪:为每个请求分配唯一ID,便于追踪
-
用户信息:记录当前操作用户
-
会话信息:存储会话相关数据
-
业务上下文:添加业务相关的上下文信息
三、slf4j 日志跟踪器 MDC怎么用
import org.slf4j.MDC;
// 放入上下文信息
MDC.put("requestId", "12345");
MDC.put("user", "john.doe");
// 记录日志 - 这些上下文信息可以被日志模式引用
logger.info("Processing request");
// 移除特定键
MDC.remove("user");
// 清除所有上下文信息
MDC.clear();
重要特性
-
线程安全:每个线程有自己的 MDC 上下文
-
继承:子线程会继承父线程的 MDC 上下文
-
清理:必须及时清理不再需要的 MDC 内容,否则可能导致内存泄漏
注意事项
public void handleRequest(Request request) {
try {
MDC.put("requestId", request.getId());
MDC.put("clientIp", request.getClientIp());
logger.info("Request received");
// 处理请求...
logger.info("Request processed successfully");
} finally {
MDC.clear(); // 确保清理
}
}
使用实例
设置信息
在过滤器里设置
@Slf4j
public class JwtFilter extends OncePerRequestFilter
// 将用户信息放入 MDC 中
MDC.put(CommonConstant.USER_NAME, claims.getSubject());
MDC.put(CommonConstant.QW_USER_ID, String.valueOf(claims.get(CommonConstant.QW_USER_ID)));
MDC.put(CommonConstant.STAFF_NUMBER, String.valueOf(claims.get(CommonConstant.STAFF_NUMBER)));
log.info("当前登录人: {} -- {}", MDC.get(CommonConstant.USER_NAME), MDC.get(CommonConstant.STAFF_NUMBER));
取信息
可以在controller里取
String staffNumber = MDC.get(CommonConstant.STAFF_NUMBER);