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

如何在Spring Boot的OpenTelemetry日志中添加trace_id与span_id?

可行方案:在Spring Boot日志中注入trace_id/span_id实现与Loki/Tempo关联

最新版OpenTelemetry Spring Boot Starter会自动将traceId和spanId注入到MDC(Mapped Diagnostic Context)中,只需通过日志框架配置即可将这两个字段输出到日志里,以下是具体实现方式:


方案1:直接在日志格式中添加trace_id/span_id

Logback 配置(logback-spring.xml)

修改编码器的输出模式,加入MDC中的traceId和spanId字段:

<encoder>
    <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{traceId:-}] [%X{spanId:-}] %logger{36} - %msg%n</pattern>
</encoder>

:-用于处理无链路上下文的场景,避免日志出现占位符。

Log4j2 配置(log4j2-spring.xml)

在PatternLayout中添加对应的MDC字段:

<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %X{traceId:-} %X{spanId:-} %logger{36} - %msg%n"/>

方案2:输出结构化JSON日志(适配Loki解析)

如果需要让Loki更便捷地提取traceId和spanId作为独立可查询字段,推荐输出JSON格式日志:

Logback 结构化配置

引入logstash-logback-encoder依赖后,配置JSON编码器:

<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
    <providers>
        <timestamp/>
        <thread/>
        <level/>
        <logger/>
        <message/>
        <mdc>
            <fieldName>traceId</fieldName>
            <fieldName>spanId</fieldName>
        </mdc>
        <stackTrace/>
    </providers>
</encoder>

输出的JSON日志会包含独立的traceId和spanId字段,Loki可直接识别并用于关联Tempo追踪链路。


方案3:确保OTel自动配置生效

在application.properties或application.yml中显式确认MDC注入开关开启(默认已开启,可用于排查配置失效问题):

otel.instrumentation.logging.mdc.enabled=true
# 可选:自定义MDC中的键名(默认即为traceId/spanId)
otel.instrumentation.logging.mdc.trace-id-key=traceId
otel.instrumentation.logging.mdc.span-id-key=spanId

验证方式

启动应用后,触发业务请求,查看日志输出确认每条链路日志都包含traceId和spanId。之后即可在Loki中通过traceId查询对应日志,再关联到Tempo中的完整追踪链路,实现双向关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:43:23