Spring Boot 2.2.2中Micrometer Tracing无traceId/spanId输出问题求助
我正在使用Spring Boot 2.2.2.RELEASE版本,控制器类如下:
@RestController public class HelloController { private static final Logger LOGGER = LogManager.getLogger(HelloController.class); @GetMapping(value = "{userId}") public String test(@PathVariable("userId") String userId){ LOGGER.info("user = {}",userId); return "ok"; } }
pom.xml已添加Micrometer Tracing依赖,同时使用Log4j2日志库:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>loglama</artifactId> <version>0.0.1-SNAPSHOT</version> <name>loglama</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jul</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-log4j-appender</artifactId> <version>3.5.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Micrometer Tracing --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> <version>1.1.2</version> </dependency> <!-- Micrometer Tracing Bridge Brave --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> <version>1.1.2</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bom</artifactId> <version>1.1.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
日志格式已添加[%X{traceId},%X{spanId}]:
appender.console.layout.pattern = [%d{yyy-MM-dd HH:mm:ss:SSS}] [%X{traceId},%X{spanId}] [%p] - %l - %m%n
日志输出如下:
[2023-07-11 10:45:49:889] [,] [INFO] - com.example.loglama.controller.HelloController.test(HelloController.java:18) - user = demo123
可以看到traceId和spanId为空,且公司不允许升级Spring Boot版本,请问如何解决该问题?
Spring Boot 2.2.2.RELEASE未与Micrometer Tracing深度集成,当前依赖的组件需要额外配置才能绑定Web请求链路并将traceId/spanId写入日志MDC,具体步骤如下:
补充Brave依赖
原pom中缺少Brave对Spring Web的拦截器和Log4j2的MDC适配组件,添加以下依赖(版本与Micrometer Tracing 1.1.2兼容):<!-- Brave Spring Web拦截器:为HTTP请求创建trace/span --> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-spring-web</artifactId> <version>5.14.1</version> </dependency> <!-- Brave Log4j2集成:将traceId/spanId写入MDC --> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-log4j2</artifactId> <version>5.14.1</version> </dependency>手动注册Brave TraceFilter
Spring Boot 2.2.2不会自动注册Brave的Web拦截器,需手动配置Bean:import brave.Tracing; import brave.spring.web.TracingFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TracingConfig { @Bean public TracingFilter tracingFilter(Tracing tracing) { return new TracingFilter(tracing); } }该Filter会为每个HTTP请求生成trace和span,并将上下文存入ThreadLocal,供Brave的Log4j2组件读取并写入MDC。
验证MDC键名匹配
Brave默认向MDC写入的键就是traceId和spanId,与你现有日志格式中的配置一致,无需修改日志模板。启用Micrometer Tracing配置
在application.properties中添加配置确保组件生效:management.tracing.enabled=true
完成上述配置后重启应用,发起HTTP请求即可在日志中看到正常的traceId和spanId。
内容的提问来源于stack exchange,提问作者Sezer Aydın

