迁移至Spring Boot 3后MDC Context Map返回null问题求助
Spring Boot 3.0 下MDC拿不到traceId/spanId的解决办法
迁移到Spring Boot 3.0后MDC无法获取链路ID,核心原因是原Spring Cloud Sleuth被替换为Micrometer Tracing,再加上Logback 1.4.x的适配规则变化,需要做以下操作:
替换依赖:之前用Spring Cloud Sleuth的话,现在要换成Micrometer Tracing相关依赖。比如引入
micrometer-tracing和micrometer-tracing-bridge-brave(以Brave作为追踪实现为例),原Sleuth依赖可以直接移除。调整Logback配置:Logback 1.4.x需要明确注册Micrometer的链路ID转换器,在
logback-spring.xml中添加配置:<configuration> <!-- 注册traceId和spanId的格式转换器 --> <conversionRule conversionWord="traceId" converterClass="io.micrometer.tracing.logback.TraceIdConverter"/> <conversionRule conversionWord="spanId" converterClass="io.micrometer.tracing.logback.SpanIdConverter"/> <!-- 在日志格式中直接使用%traceId和%spanId --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - traceId:%traceId spanId:%spanId - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="CONSOLE"/> </root> </configuration>确认上下文传播未被禁用:Spring Boot 3.0默认启用上下文传播,不要在配置中排除
ContextPropagationAutoConfiguration,否则TraceContext无法正常初始化。Java 17模块化适配(若使用模块化):如果项目用了
module-info.java,需要在模块声明中添加依赖:module your.module.name { requires micrometer.tracing; requires micrometer.tracing.logback; requires ch.qos.logback.classic; // 其他必要依赖 }手动获取MDC的键名适配:如果代码中直接调用
MDC.get("traceId"),要注意不同追踪实现的默认键名差异。比如Brave默认用X-B3-TraceId和X-B3-SpanId,可以在application.yml中配置统一键名:micrometer: tracing: baggage: fields: traceId: traceId spanId: spanId
内容的提问来源于stack exchange,提问作者Digital
相关产品推荐
相关产品推荐

