1. 为什么需要日志链路追踪
在分布式系统开发中,一个外部请求往往需要经过多个微服务处理。当系统出现问题时,开发人员需要快速定位问题发生的具体环节。传统的日志记录方式存在两个明显痛点:
- 日志分散:请求在不同服务间的流转过程难以串联
- 排查困难:无法直观识别哪些日志属于同一次请求
我在实际项目中就遇到过这样的场景:用户反馈订单支付失败,但查看日志发现支付服务、订单服务、库存服务都报了不同错误。当时花了整整3小时才理清完整的调用链条。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. TraceId的核心实现原理
2.1 链路追踪的三大要素
完整的链路追踪系统需要包含以下核心要素:
- TraceId:全局唯一的追踪标识,贯穿整条调用链
- SpanId:单个服务内部的调用标识
- ParentSpanId:标识上级调用来源
以电商下单流程为例:
code复制[TraceId:123] 用户请求 -> 订单服务(SpanId:1)
-> 支付服务(SpanId:1.1, Parent:1)
-> 库存服务(SpanId:1.1.1, Parent:1.1)
2.2 SpringBoot中的实现方案
SpringBoot可以通过过滤器+MDC实现轻量级追踪:
java复制// TraceFilter.java
public class TraceFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String traceId = request.getHeader("X-Trace-Id");
if(StringUtils.isEmpty(traceId)){
traceId = UUID.randomUUID().toString();
}
MDC.put("traceId
