Spring Boot控制台日志不显示Trace/Span ID但Grafana可见的问题排查
解决控制台日志不显示trace_id/span_id的问题
你的核心问题是OpenTelemetry默认未自动将trace和span ID注入MDC(Mapped Diagnostic Context),所以即使配置了日志pattern,也无法读取到对应值。以下是具体解决步骤:
1. 开启OpenTelemetry的MDC自动注入
在application.properties中添加关键配置,强制OpenTelemetry把trace/span信息写入MDC:
otel.instrumentation.common.mdc.enabled=true otel.instrumentation.common.mdc.legacy.keys=false
otel.instrumentation.common.mdc.enabled=true:开启MDC注入功能,这是解决问题的核心配置otel.instrumentation.common.mdc.legacy.keys=false:确保使用标准的trace_id和span_id键名,避免与旧版本的键名冲突
2. 确认日志框架的MDC引用正确
如果你用Spring Boot默认的Logback,现有logging.pattern.level配置是有效的,但要确保没有自定义日志配置(比如logback-spring.xml)覆盖它。如果是自定义Logback配置,需在pattern中明确引用MDC变量:
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] trace_id=%X{trace_id} span_id=%X{span_id} %-5level %logger{36} - %msg%n</pattern>
3. 验证依赖版本兼容性
Spring Boot 3.4.0需要搭配兼容的OpenTelemetry Spring Starter版本,建议使用最新稳定版(如1.36.0及以上),避免版本不匹配导致的功能失效。Maven依赖示例:
<dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-spring-boot-starter</artifactId> <version>1.36.0</version> </dependency>
4. 排除自定义逻辑干扰
如果项目中有自定义的Trace拦截器或上下文传递代码,检查是否存在手动清空MDC、未正确传递OpenTelemetry上下文的情况,这类代码会覆盖默认的MDC注入逻辑。
5. 快速验证MDC注入状态
可以添加一个测试接口,手动打印MDC中的值,确认注入是否生效:
@GetMapping("/trace-test") public String traceTest() { System.out.println("trace_id: " + MDC.get("trace_id")); System.out.println("span_id: " + MDC.get("span_id")); return "trace test completed"; }
- 如果能打印出有效ID,说明MDC注入正常,问题出在日志配置
- 如果打印
null,说明OpenTelemetry的MDC注入未生效,需要重新检查配置和依赖
内容的提问来源于stack exchange,提问作者Shubham Goel
相关产品推荐
相关产品推荐

