网站的布局设计,新品发布会主题,wordpress不能登录,作文网课Spring Boot 统一日志与链路追踪实践在真实的 Spring Boot 项目中#xff0c;仅仅“能跑”远远不够。
能定位问题、能还原请求、能快速排障#xff0c;才是一个成熟后端系统的核心能力。而这一切#xff0c;都离不开 统一日志与链路追踪#xff08;Trace#xff09;。一、…Spring Boot 统一日志与链路追踪实践在真实的 Spring Boot 项目中仅仅“能跑”远远不够。能定位问题、能还原请求、能快速排障才是一个成熟后端系统的核心能力。而这一切都离不开统一日志与链路追踪Trace。一、为什么要做统一日志与链路追踪如果没有统一日志常见问题包括日志格式杂乱无章不同接口日志风格不一致一次请求的日志散落在多行、多个类中微服务场景下无法串联完整调用链❌ 出现线上问题时只能“猜”。✅ 统一日志与链路追踪能解决什么一次请求 一个 TraceId所有日志都能被串起来快速定位慢接口、异常接口为监控、告警、埋点提供基础数据二、日志、链路追踪的整体设计思路推荐分层设计请求入口Filter ↓ 生成 TraceId ↓ 放入 MDC日志上下文 ↓ 业务日志自动携带 TraceId ↓ 请求结束清理 MDC三、Spring Boot 日志体系基础Spring Boot 默认使用SLF4J门面Logback实现推荐日志使用方式private static final Logger log LoggerFactory.getLogger(UserController.class);不要直接使用System.out.println()四、什么是链路追踪Trace核心概念概念含义TraceId一次请求的唯一标识Span调用链中的一个节点MDC日志上下文存储在单体应用中TraceId 就足够五、基于 MDC 的链路追踪实现1️⃣ 什么是 MDCMDCMapped Diagnostic Context是 Logback 提供的线程级上下文变量存储。MDC.put(traceId, xxx);日志中即可自动打印。2️⃣ 请求入口生成 TraceIdFilterComponent public class TraceFilter implements Filter { private static final String TRACE_ID traceId; Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { try { String traceId UUID.randomUUID().toString().replace(-, ); MDC.put(TRACE_ID, traceId); chain.doFilter(request, response); } catch (Exception e) { throw new RuntimeException(e); } finally { MDC.remove(TRACE_ID); } } }3️⃣ 日志配置中打印 TraceIdlogback-spring.xmlpattern %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [traceId%X{traceId}] - %msg%n /pattern4️⃣ 日志效果示例2025-01-01 10:00:01.123 [http-nio-8080-exec-1] INFO UserController [traceId9f8a3b7c2d1a4e] - 查询用户信息 同一次请求的所有日志traceId 完全一致六、统一请求日志接口维度使用 HandlerInterceptorComponent public class LogInterceptor implements HandlerInterceptor { private static final Logger log LoggerFactory.getLogger(LogInterceptor.class); Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { log.info(请求开始: {} {}, request.getMethod(), request.getRequestURI()); return true; } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { log.info(请求结束: {} {}, request.getMethod(), request.getRequestURI()); } }注册拦截器Configuration public class WebConfig implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) .addPathPatterns(/**); } }七、记录接口耗时性能关键long start System.currentTimeMillis(); // 业务逻辑 long cost System.currentTimeMillis() - start; log.info(接口耗时: {} ms, cost);推荐统一在拦截器中处理避免重复代码。八、异常日志统一记录结合全局异常处理ExceptionHandler(Exception.class) public ApiResponseVoid handleException(Exception e) { log.error(系统异常, e); return ApiResponse.error(500, 服务器内部错误); } 异常日志必须打印堆栈九、日志分级规范非常重要级别使用场景DEBUG开发调试INFO关键业务流程WARN可预期异常ERROR系统异常❌ 不要滥用 ERROR❌ 不要把正常流程打成 WARN十、微服务场景下的链路追踪扩展1️⃣ TraceId 透传网关生成 TraceIdHTTP Header 传递X-Trace-Id: xxx2️⃣ Spring Cloud 场景Sleuth旧Micrometer Tracing新Zipkin / SkyWalking十一、统一日志最佳实践总结✅ Filter 生成 TraceId✅ MDC 保存上下文✅ 日志格式统一✅ 接口日志 异常日志✅ 日志分级清晰十二、总结统一日志与链路追踪是后端系统“可运维性”的基石。在 Spring Boot 项目中MDC 是最低成本的链路追踪方案单体应用足够用微服务可平滑升级到专业链路系统写日志不是为了“看”而是为了在出问题时能快速定位问题。