自定义Logback日志无法显示Sleuth的spanId与traceId求助
我在自定义Logback配置中尝试输出Sleuth的spanId和traceId,但这两个字段始终为空。
我的Logback配置如下:
<appender name="ELK-CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <pattern> <pattern> { "timestamp": "@timestamp", "severity": "%level", "service": "${springAppName:-}", "trace": "%X{traceId:-}", "span": "%X{spanId:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } </pattern> </pattern> </providers> </encoder> </appender>
实际输出的日志中trace和span字段为空:
{ "timestamp":"@timestamp", "severity":"INFO", "service":"springAppName_IS_UNDEFINED", "trace":"", "span":"", "pid":"21524", "thread":"reactor-http-nio-3", "class":"elk-logger", "rest":"test log content" }
我曾尝试改用%X{X-B3-TraceId:-}和%X{X-B3-SpanId:-}来获取字段,但问题依旧。不确定是否遗漏了相关配置,恳请各位提供解决建议。
确认Sleuth依赖是否正确引入
从线程名reactor-http-nio-3看出是响应式项目,确保已引入spring-cloud-starter-sleuth依赖,且版本与Spring Boot版本匹配,避免版本冲突导致Sleuth无法正常初始化。检查Sleuth启用状态
查看application.yml或application.properties,确保没有配置spring.sleuth.enabled=false,默认Sleuth是启用的,若有禁用配置需删除或改为true。使用Logstash Sleuth扩展编码器
针对LoggingEventCompositeJsonEncoder,无需手动从MDC取值,直接添加Sleuth专属提供者即可自动注入traceId和spanId:<providers> <!-- 保留原有pattern等其他提供者 --> <pattern>...</pattern> <sleuth/> </providers>该配置会自动在JSON日志中添加
traceId和spanId字段,无需手动配置%X{traceId}。响应式场景下确认上下文传递
WebFlux等响应式环境中,Sleuth上下文通过Reactor的Context传递而非ThreadLocal。如果日志是在脱离请求链路的线程(比如手动创建的线程池)中输出,MDC不会携带traceId/spanId,需确保日志输出代码处于请求处理的Reactor流内。检查Logback配置加载方式
确保使用logback-spring.xml作为配置文件名,而非logback.xml。Spring Boot整合Sleuth需要通过Spring上下文初始化MDC相关配置,logback-spring.xml会被Spring优先加载,保证Sleuth的日志上下文生效。
内容的提问来源于stack exchange,提问作者Max Chan

