如何在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
相关产品推荐
相关产品推荐

