Spring Sleuth+Log4j2无法打印spanExportable/X-Span-Export日志字段
问题原因
- 你当前的Spring Sleuth与Log4j2集成本身是正常的,能输出traceId、spanId就说明MDC上下文注入的基础配置没有问题。
- Spring Cloud Sleuth在2.x及之后的版本中,默认关闭了Span导出标识的MDC注入,不会把
spanExportable或X-Span-Export字段写入MDC,因此你打印全量MDC时看不到这两个属性,对应配置的日志pattern自然也无法输出对应值。 - 你尝试的两个pattern键名对应不同Sleuth旧版本的导出标识key:
spanExportable是Sleuth 1.x版本使用的MDC键名,X-Span-Export是Sleuth 2.x早期小版本使用的键名,新版本默认都不会注入这两个字段。 - 该字段默认关闭注入的原因是:Span Exportable本质是标记当前Span是否会被上报到链路收集端(如Zipkin、Jaeger)的采样标识,绝大多数场景下日志排查只需要traceId、spanId做链路关联即可,不需要额外输出采样标记,默认关闭可以减少MDC的冗余内容。
解决方案
- 开启导出标识的MDC注入配置
在项目的application.yml或application.properties中添加如下配置,显式开启Span导出状态的MDC注入:
配置生效后,Sleuth会自动将spring: sleuth: log: slf4j: mdc: span-exportable-enabled: truespanExportable字段写入MDC,值为true/false对应当前Span是否会被采样上报,此时日志pattern中使用%X{spanExportable}即可正常打印该标识。 - 高版本适配注意
如果你使用的是Spring Cloud 2021.0.0之后的版本(对应Sleuth 3.1.x及以上),如果开启上述配置后仍无法打印,可以先临时配置%X打印全量MDC,确认当前版本实际注入的导出标识键名,再调整日志pattern中的键名即可。 - 非必要场景可以跳过配置
如果你的日志输出核心需求是做链路日志关联,不需要判断单条Span的采样上报状态,完全可以不用配置该字段,保留traceId、spanId的输出即可满足绝大多数链路排查需求。
内容的提问来源于stack exchange,提问作者Vinesh
相关产品推荐
相关产品推荐

