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);
    }
}
相关推荐
希望永不加班11 小时前
SpringBoot 集成测试:@SpringBootTest 与 MockMvc
java·spring boot·后端·log4j·集成测试
Howrun7775 天前
C++ 项目测试全指南:从 0 基础到落地实操
开发语言·c++·log4j
admin and root7 天前
从资产收集FUZZ接口到SQL注入案例
网络·数据库·sql·安全·web安全·渗透测试·log4j
Joy T7 天前
【Web3】智能合约质量保障工程:从单元测试到 Gas 效能优化
单元测试·log4j·web3·智能合约·hardhat
sg_knight9 天前
使用 Claude Code 写单元测试的实战方法
单元测试·log4j·ai编程
sthnyph9 天前
SpringBoot Test详解
spring boot·后端·log4j
brucelee18610 天前
Spring Boot 测试最佳实践
spring boot·后端·log4j
X-TIE10 天前
一次日志引发的“血案”:从 Log4j 1.x 锁竞争到 Log4j 2.x 异步写入实战
log4j
zdl68614 天前
SpringBoot Test详解
spring boot·后端·log4j
lierenvip15 天前
Spring Boot 整合 log4j2 日志配置教程
spring boot·单元测试·log4j