news 2026/4/19 19:58:17

【后端】【Java】一文详解Spring Boot 统一日志与链路追踪实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【后端】【Java】一文详解Spring Boot 统一日志与链路追踪实践

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️⃣ 什么是 MDC?

MDC(Mapped Diagnostic Context)是 Logback 提供的线程级上下文变量存储

MDC.put("traceId", "xxx");

日志中即可自动打印。


2️⃣ 请求入口生成 TraceId(Filter)

@Component 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️⃣ 日志配置中打印 TraceId(logback-spring.xml)

<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [traceId=%X{traceId}] - %msg%n </pattern>

4️⃣ 日志效果示例

2025-01-01 10:00:01.123 [http-nio-8080-exec-1] INFO UserController [traceId=9f8a3b7c2d1a4e] - 查询用户信息

👉 同一次请求的所有日志traceId 完全一致


六、统一请求日志(接口维度)

使用 HandlerInterceptor

@Component 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 ApiResponse<Void> handleException(Exception e) { log.error("系统异常", e); return ApiResponse.error(500, "服务器内部错误"); }

👉 异常日志必须打印堆栈


九、日志分级规范(非常重要)

级别使用场景
DEBUG开发调试
INFO关键业务流程
WARN可预期异常
ERROR系统异常

❌ 不要滥用 ERROR
❌ 不要把正常流程打成 WARN


十、微服务场景下的链路追踪(扩展)

1️⃣ TraceId 透传

  • 网关生成 TraceId

  • HTTP Header 传递:

X-Trace-Id: xxx

2️⃣ Spring Cloud 场景

  • Sleuth(旧)

  • Micrometer Tracing(新)

  • Zipkin / SkyWalking


十一、统一日志最佳实践总结

✅ Filter 生成 TraceId
✅ MDC 保存上下文
✅ 日志格式统一
✅ 接口日志 + 异常日志
✅ 日志分级清晰


十二、总结

统一日志与链路追踪,是后端系统“可运维性”的基石。

在 Spring Boot 项目中:

  • MDC 是最低成本的链路追踪方案

  • 单体应用足够用

  • 微服务可平滑升级到专业链路系统

写日志不是为了“看”,
而是为了在出问题时能快速定位问题

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:42:52

50、Linux NFS 网络文件系统全解析

Linux NFS 网络文件系统全解析 1. NFS 常见问题及解决办法 在使用 NFS 时,可能会遇到一些常见问题,下面为你详细介绍并提供解决方法。 - 主机名/IP 配对错误 :服务器对主机名/IP 配对的认知可能不正确,这可能是由于 /etc/hosts 文件或域名系统(DNS)表中的错误导致…

作者头像 李华
网站建设 2026/4/16 10:42:32

Linux编辑器—vim的使用

本期来讲解Linux中常用且高效的编辑器vim的基本使用和指令操作 目录 一、vim的主要三种工作模式 1.命令模式&#xff08;Command Mode&#xff09; 2.插⼊模式(Insert mode) 3.底行模式&#xff08;Last Line Mode&#xff09; 二、vim的基本操作 三、vim命令模式下的命…

作者头像 李华
网站建设 2026/4/18 21:04:13

STM32F103C8T6 + SI24R1实现2.4G通信

原理图&#xff1a;SPI时序可以看的出来&#xff0c;SCK空闲时低电平&#xff0c;第一个跳变采样&#xff0c;高位先行&#xff0c;8Bit&#xff0c;HAL库可以这样配置宏定义&#xff1a;#define MY_RF_CH 69 #define RX_MODE 0 #define TX_MODE 1#define SI24R1_CSN_LOW HAL_G…

作者头像 李华
网站建设 2026/4/15 18:24:38

Notepad++紧急更新,且是两个版本,究竟修复了什么

开源文本编辑器 Notepad 接连发布了 v8.8.8/v8.8.9 更新&#xff0c;修复了更新组件 WinGUp 在对下载文件签名和证书校验不够严格的问题。 上月&#xff0c;Notepad 爆出了安全漏洞&#xff1a;在安装了 Notepad 的机器上&#xff0c;黑客劫持网络后&#xff0c;利用自动更新机…

作者头像 李华
网站建设 2026/4/18 12:37:05

MySQL 的 MVCC(多版本并发控制)详解

MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是 MySQL InnoDB 存储引擎实现事务隔离级别的核心机制&#xff0c;其核心目标是在不加锁&#xff08;或减少加锁&#xff09;的情况下&#xff0c;实现读写并发&#xff0c;同时保证事…

作者头像 李华
网站建设 2026/4/16 1:03:50

Unione Flow Editor 流程节点属性控件事件机制深度解析

Unione Flow Editor 流程节点属性控件事件机制深度解析 在企业级流程编辑器的落地实践中&#xff0c;流程节点的属性配置是承接业务逻辑的核心载体。不同业务场景对属性控件的交互需求往往复杂多变&#xff1a;审批类型切换时需隐藏冗余属性、特定条件下需动态标记必填项、选择…

作者头像 李华