You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Spring Cloud Sleuth生成的Trace ID从Spring Boot服务传递至自定义Java框架服务并用于日志?

跨服务Trace ID传递与日志集成方案

一、服务A(Spring Boot + Spring Cloud Sleuth)配置

Spring Cloud Sleuth默认遵循B3追踪规范,会自动向HTTP请求注入Trace ID相关请求头,无需额外开发,只需确保以下配置:

  • 引入Spring Cloud Sleuth依赖:
    Maven项目添加:
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    
  • 使用官方推荐的HTTP客户端(RestTemplate/WebClient):
    Sleuth会自动为RestTemplate注入TraceRestTemplateInterceptor,为WebClient注入追踪拦截器,调用服务B的API时,请求头中会自动携带X-B3-TraceId(Trace ID)、X-B3-SpanId等字段。
  • 若需自定义Trace ID请求头名称,可在application.yml中配置:
    spring:
      sleuth:
        propagation:
          headers:
            trace-id: Custom-Trace-Id # 替换为自定义头名
    

二、服务B(自定义Java Web应用)处理流程

服务B需要手动完成Trace ID接收、上下文存储、日志集成三个步骤:

1. 接收并存储Trace ID

在请求入口处(如Servlet过滤器、自定义请求解析器)读取请求头中的Trace ID,存入线程上下文(推荐用SLF4J的MDC,或自定义ThreadLocal):
示例:基于Servlet的过滤器实现

public class TraceIdContextFilter implements Filter {
    // 与服务A保持一致的头名称,默认是X-B3-TraceId
    private static final String TRACE_ID_HEADER = "X-B3-TraceId";
    // MDC中的键名,后续日志配置会用到
    private static final String MDC_TRACE_KEY = "traceId";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) request;
        String traceId = httpReq.getHeader(TRACE_ID_HEADER);
        if (traceId != null) {
            MDC.put(MDC_TRACE_KEY, traceId);
        }
        try {
            chain.doFilter(request, response);
        } finally {
            // 必须清理MDC,避免线程池复用导致的ID污染
            MDC.remove(MDC_TRACE_KEY);
        }
    }
}

如果是自定义非Servlet框架,只需在请求解析阶段读取请求头,将Trace ID存入ThreadLocal,并在请求结束后清理。

2. 日志集成Trace ID

修改日志框架配置,将MDC/ThreadLocal中的Trace ID加入日志输出模板:

  • 若使用Log4j2,修改log4j2.xml的PatternLayout:
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %X{traceId} - %msg%n"/>
    
  • 若使用Logback,修改logback.xml的encoder:
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %X{traceId} - %msg%n</pattern>
    </encoder>
    

之后服务B的日志就会自动带上从服务A传递过来的Trace ID。

3. 可选:下游传递

如果服务B需要调用其他服务,可在发起HTTP请求时,从MDC/ThreadLocal中取出Trace ID,添加到请求头中,延续追踪链路。

内容的提问来源于stack exchange,提问作者Sahil Aggarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:15:42