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);
    }
}
相关推荐
闻哥2 天前
从测试坏味道到优雅实践:打造高质量单元测试
java·面试·单元测试·log4j·springboot
知行合一。。。3 天前
程序中的log4j、stderr、stdout日志
python·单元测试·log4j
独自破碎E3 天前
Spring Boot测试启动失败:SLF4J日志多实现冲突解决方案
spring boot·后端·log4j
niaiheni4 天前
Log4j 漏洞深度分析:CVE-2021-44228 原理与本质
web安全·网络安全·log4j
独处东汉5 天前
freertos开发空气检测仪之串口驱动与单元测试实践
单元测试·log4j
世界尽头与你5 天前
CVE-2017-5645_ Apache Log4j Server 反序列化命令执行漏洞
网络安全·渗透测试·log4j·apache
A懿轩A6 天前
【Maven 构建工具】Maven 生命周期完全解读:clean / default / site 三套生命周期与常用命令
java·log4j·maven
我送炭你添花9 天前
Pelco KBD300A 模拟器:19.pytest集成测试(serial + protocol + macro)
python·log4j·集成测试
我送炭你添花10 天前
Pelco KBD300A 模拟器:18. 按依赖顺序 + 复杂度由低到高逐步推进pytest单元测试
python·单元测试·log4j·pytest
凹凸曼coding10 天前
Java业务层单元测试通用编写流程(Junit4+Mockito实战)
java·单元测试·log4j