Spring Boot 3中@KafkaListener日志缺失traceId/spanId问题求助
在Spring Boot 3中实现日志携带traceId/spanId的解决方法
问题背景
Spring Boot 2依赖Sleuth可实现日志自动携带traceId,但Spring Boot 3已移除Sleuth,官方推荐使用micrometer-tracing替代。已添加以下依赖:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> <version>1.3.0</version> </dependency>
并在application.properties配置:
spring.kafka.listener.observation-enabled=true logging.pattern.console="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [${spring.application.name:-},%X{traceId:-},%X{spanId:-}] 0 --- [%15.80t] %-40.40logger{39} : %msg%n"
但日志中仍未出现traceId和spanId。
解决步骤
1. 优化依赖配置
Spring Boot 3.x建议通过Starter管理依赖,避免版本兼容问题,替换原有依赖为:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency>
说明:
micrometer-tracing会被micrometer-tracing-bridge-brave间接引入,无需单独声明;spring-boot-starter-actuator是观测能力的基础依赖,缺失会导致追踪功能无法正常初始化。
2. 修正日志格式
原日志配置的首尾双引号会导致%X{traceId}等变量无法被正确解析,同时冗余的0会破坏日志格式,修改为:
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [${spring.application.name:-},%X{traceId:-},%X{spanId:-}] --- [%15.80t] %-40.40logger{39} : %msg%n
3. 完善Kafka观测配置
仅开启消费者观测不足以覆盖全链路,需同时启用生产者观测:
spring.kafka.producer.observation-enabled=true
4. 确保观测上下文传播
- Web请求场景:默认会自动创建trace上下文,无需额外配置;
- 异步/自定义线程池场景:需手动传递观测上下文,可通过
Observation包裹业务逻辑:
Observation.createNotStarted("custom-task", observationRegistry) .observe(() -> { // 你的业务代码 });
5. 检查全局观测开关
确保未手动关闭观测功能,以下配置需删除或设为true:
management.observation.enabled=true
内容的提问来源于stack exchange,提问作者Darkin Rall
相关产品推荐
相关产品推荐

