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

Spring Boot中OpenTelemetry Logger MDC日志链路关联问题排查

问题解决:Spring Boot中OpenTelemetry Span信息未注入日志MDC

针对你遇到的「Trace已导出但日志MDC中无trace_id/span_id」问题,可从以下几个关键点排查修复:

1. 补充日志框架的Instrumentation依赖

OpenTelemetry的MDC自动注入需要对应日志框架的适配依赖,Spring Boot默认用SLF4J+Logback,需添加:

<dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-logback-mdc-1.0</artifactId>
    <version>1.22.1-alpha</version>
</dependency>

如果用Log4j2,替换为opentelemetry-log4j-mdc-2.17依赖,版本和你的OpenTelemetry starter保持一致即可。

2. 确认OpenTelemetry基础配置

确保服务名配置正确,让自动配置能正常初始化上下文:

spring.application.name=your-service-name
opentelemetry.service.name=your-service-name

3. 优化日志格式配置(可选)

你当前的logging.pattern.level配置逻辑没问题,但部分Logback版本对%mdc{key}语法支持有差异,可换成Logback原生的%X{key}语法,比如在application.properties中:

logging.pattern.level = trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %5p

或者直接在logback-spring.xml里定义完整的日志格式:

<Pattern>
    %d{yyyy-MM-dd HH:mm:ss.SSS} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %5p %t --- [%thread] %logger{36} : %msg%n
</Pattern>

4. 检查线程上下文传播

你手动调用Span.current()能拿到信息,说明Span上下文存在,但如果日志是在自定义线程池/非Spring管理线程中打印的,需要手动传播Span上下文:

Span currentSpan = Span.current();
executorService.submit(() -> {
    try (Scope scope = currentSpan.makeCurrent()) {
        log.info("需要关联链路的日志内容");
    }
});

如果用了异步Servlet或Reactor,当前OpenTelemetry版本已支持异步场景,但要避免自定义拦截器破坏上下文传递链。

5. 版本兼容性优化(可选)

你使用的1.22.1-alpha是测试版,建议升级到OpenTelemetry稳定版(如1.30+),减少版本适配bug,同时保持和Spring Boot 2.7.2的兼容性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:05:20