mdc实现日志链路追踪

bash 复制代码
配置好log4j2
 <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%X{TraceId}] [%p] - %l - %m%n"/>

WebMvcConfigurer
 @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getSecurityInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/swagger-resources/**")
                .excludePathPatterns("/webjars/**")
                .excludePathPatterns("**/swagger-ui.html");

        registry.addInterceptor(new AsyncHandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request,
                                     HttpServletResponse response,
                                     Object handler) throws Exception {
                response.setHeader("TraceId",TraceIdUtil.get());
                TraceIdUtil.putIfAbsent();//生成trace id放入MDC中
                return AsyncHandlerInterceptor.super.preHandle(request, response, handler);
            }

            @Override
            public void afterCompletion(HttpServletRequest request,
                                        HttpServletResponse response,
                                        Object handler, Exception ex) throws Exception {
                TraceIdUtil.remove();//移除MDC中的trace id
                AsyncHandlerInterceptor.super.afterCompletion(request, response, handler, ex);
            }
        });
        WebMvcConfigurer.super.addInterceptors(registry);
    }

TraceIdUtil
public class TraceIdUtil {
    private static final String TRACE_ID_KEY = "TraceId";
    private TraceIdUtil() {
    }
    public static void putIfAbsent() {
        if (StringUtils.isBlank(get())) {
            put(UUID.randomUUID().toString());
        }
    }
    public static void remove() {
        if (get() != null) {
            MDC.remove(TRACE_ID_KEY);
        }
    }
    public static String get() {
        return MDC.get(TRACE_ID_KEY);
    }
    public static void put(String traceId) {
        MDC.put(TRACE_ID_KEY, traceId);
    }
}
相关推荐
汤姆宝库1 天前
推理时计算深拆:思维链、验证搜索与测试时Scaling
log4j
神一样的老师8 天前
WS63 嵌入式 SSD1306 OLED 驱动单元测试实战
单元测试·log4j
silvamux_10 天前
大模型 API 单元测试怎么 mock 不误伤
单元测试·log4j·php
system_error_x11 天前
自动化常规代码辅助系统
运维·自动化·log4j
看浪的路人11 天前
第10讲:大模型应用测试——从单元测试到 E2E 评测的完整体系
log4j
草莓熊Lotso13 天前
【C++ 基于微服务的即时通讯系统】基建三件套:gflags + gtest + spdlog 源码编译安装与实战入门
linux·网络·数据库·c++·微服务·log4j
j7~14 天前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
楚楚25115 天前
2026最新6款Cursor平替AI编程工具深度实测对比
log4j
回眸&啤酒鸭16 天前
【回眸】自动化白盒测试落地实战指南
运维·自动化·log4j
我就是不信17 天前
CuTest:轻量级 C 语言单元测试框架实战指南
c语言·单元测试·log4j