如何将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
相关产品推荐
相关产品推荐

