使用Micrometer时TraceId未写入日志问题排查求助
解决Spring Boot 3.x + Micrometer 日志无TraceId/SpanId的问题
下面是几个可能的遗漏点及对应解决方法:
1. 依赖配置不完整或有误
不要盲目排除io.zipkin.brave依赖,Micrometer Tracing桥接Brave需要其核心类来处理MDC注入。正确的依赖配置应该包含:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency>
如果确实存在依赖冲突,仅排除冲突的特定子模块,而非整个io.zipkin.brave组。
2. Logback配置的MDC键名错误
Micrometer Tracing + Brave组合下,默认MDC键为traceId和spanId,而非你配置的X-B3-TraceId和X-B3-SpanId。修改Logback的ConsoleAppender Pattern:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%X{traceId},%X{spanId}] - %msg%n</pattern> </encoder> </appender>
若坚持使用B3格式键名,需自定义Brave的MDC装饰器:
@Configuration public class TracingConfig { @Bean public Brave brave(Tracing tracing) { return Brave.builder(tracing) .addSpanHandler(MdcScopeDecorator.newBuilder() .clear() .add(SpanTagKey.TRACE_ID, "X-B3-TraceId") .add(SpanTagKey.SPAN_ID, "X-B3-SpanId") .build()) .build(); } }
3. 未启用Micrometer Tracing自动配置
确保Spring Boot自动配置未被禁用,检查application.properties/application.yml:
# 不要包含Micrometer或Brave相关的自动配置排除项 spring.autoconfigure.exclude=
同时确保你的启动类标注了@SpringBootApplication(已包含@EnableAutoConfiguration)。
4. 日志输出不在Span上下文范围内
如果日志是在异步线程中输出,需要手动传递Trace上下文。确保测试Controller的日志直接在请求处理线程中输出:
@RestController public class TestController { private static final Logger log = LoggerFactory.getLogger(TestController.class); @GetMapping("/test") public String test() { // 此日志应在请求Span上下文内,能自动注入TraceId/SpanId log.info("Inside test"); return "success"; } }
内容的提问来源于stack exchange,提问作者Geek_To_Learn
相关产品推荐
相关产品推荐

