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

SpringBoot 3.0.2集成Micrometer Tracing:日志自动关联Span/Trace ID失败

排查与解决步骤

1. 补全Brave与Log4j2的桥接依赖

Micrometer Tracing通过Brave桥接时,必须依赖brave-log4j2才能将Trace/Span ID注入Log4j2的MDC上下文,缺失该依赖会导致日志模板无法获取到对应ID值。

检查你的依赖配置,确保包含以下内容:

Maven

<dependency>
    <groupId>io.zipkin.brave</groupId>
    <artifactId>brave-log4j2</artifactId>
</dependency>

Gradle

implementation 'io.zipkin.brave:brave-log4j2'

2. 验证Log4j2模板的MDC键正确性

Brave默认将Trace/Span ID存入MDC的X-B3-TraceId、X-B3-SpanId键,但也支持配置为无前缀的traceId、spanId。可以先在日志模板中同时添加两种键测试:

[%X{X-B3-TraceId}] [%X{X-B3-SpanId}] [%X{traceId}] [%X{spanId}] %msg%n

如果无前缀键能输出值,说明你的配置修改了MDC键格式,需调整模板匹配正确的键名。

3. 确保ESAPI日志传递MDC上下文

ESAPI若未正确绑定Log4j2,会丢失MDC中的Trace/Span信息。修改ESAPI.properties配置文件,指定Log4j2作为日志提供者:

ESAPI.Logger=org.owasp.esapi.reference.Log4J2LogFactory

同时确认ESAPI日志调用在当前请求上下文线程中执行,避免异步场景下的MDC丢失。

4. 处理异步线程的上下文传递

如果日志在异步任务中打印,需确保Trace上下文能传递到异步线程。Spring Boot 3.x可通过配置TaskExecutor实现:

@Bean
public TaskExecutor taskExecutor(Tracer tracer) {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setTaskDecorator(new TraceTaskDecorator(tracer));
    // 按需配置线程池参数
    executor.initialize();
    return executor;
}

该配置会自动将父线程的Trace上下文传递给异步任务。

5. 确认Tracing配置生效

尽管已设置management.tracing.sampling.probability=1.0,仍需验证Tracing组件是否正常工作:

  • 注入Tracer bean,调用tracer.currentSpan(),确认返回的Span不为null
  • 查看应用启动日志,确认存在BraveTracing相关初始化日志

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:05:17