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

迁移至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:15