spring cloud sleuth 如何将跟踪信息添加到 logback 日志行

Posted

技术标签:

【中文标题】spring cloud sleuth 如何将跟踪信息添加到 logback 日志行【英文标题】:How spring cloud sleuth adds tracing information to logback log lines 【发布时间】:2021-04-27 00:29:49 【问题描述】:

我有基于 Spring Boot 的 Web 应用程序,它使用 logback 进行日志记录。

我还使用以下方法从 Spring Boot 继承了一些 logback 默认值:

<include resource="org/springframework/boot/logging/logback/base.xml"/>

我想开始记录追踪信息,所以我补充说:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

Sleuth 将跟踪信息添加到日志行,但我在模式中找不到任何 %X%mdc:https://github.com/spring-projects/spring-boot/blob/2.3.x/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml

Sleuth 如何将跟踪信息添加到日志行中?

我使用 spring-cloud-starter-parent Hoxton.SR9 父级,它带来了 Spring Boot 2.3.5.RELEASEspring-cloud-starter-sleuth 2.2.6.RELEASE

【问题讨论】:

如记录? docs.spring.io/spring-cloud-sleuth/docs/current-SNAPSHOT/… 我看到了文档,但它没有包含更多细节,所以我对这些细节很感兴趣。 我已经深入研究了源代码,我可以看到org.springframework.cloud.sleuth.log.Slf4jScopeDecorator 将信息添加到MDC,但我不明白它是如何在日志级别之后添加到日志行中的。在 Boot 中定义的默认日志模式中没有提到它。这不仅是好奇心,我还有另一个基于 log4j2 的项目,它不能开箱即用。更合乎道德的方法是不要根据未经验证的假设攻击某人。 @Gimby 这对我很有用。我实际上正在寻找完全相同的东西,并且由于 OP 首先询问,它帮助了我。我认为投票的数量表明 OP 的好奇心帮助了其他人 【参考方案1】:

(tl;dr 在底部) 从这个问题我想你已经知道traceIdspanId 被放入了MDC。

如果您查看log integration section of the sleuth docs,您会发现示例中的跟踪信息介于日志级别 (ERROR) 和 pid (97192) 之间。如果您尝试将其与 logback config 匹配,您将看到日志级别和 pid 之间没有任何内容:$LOG_LEVEL_PATTERN:-%5p $PID:- 因此跟踪信息如何到达那里可能是一个有效的问题。

如果您再看一下文档,它会说:

此日志配置由 Sleuth 自动设置。您可以通过 spring.sleuth.enabled=false 属性禁用 Sleuth 或放置您自己的 logging.pattern.level 属性来禁用它。

这仍然没有明确解释机制,但它给了你一个巨大的提示:

放置您自己的logging.pattern.level 属性

基于此,您可以认为在日志级别和 pid 之间没有,Sleuth 只是覆盖日志级别并将跟踪信息放入其中。如果您搜索文档中代码中提到的属性,您会发现it is exactly what happens:

TL;DR

Sleuth 覆盖日志级别模式并将跟踪信息添加到其中:

map.put("logging.pattern.level", "%5p [$spring.zipkin.service.name:" + "$spring.application.name:,%XtraceId:-,%XspanId:-]");

【讨论】:

感谢您的演练。我能够走到你提到的logback 部分。 TraceEnvironmentPostProcessor 的 IMO 副作用很难链接到。现在,为什么它可以与logback 一起使用以及为什么它不能与log4j2 一起使用,这一切都说得通了。 logging.pattern.level 的 Javadoc 说 Appender pattern for log level. Supported only with the default Logback setup. 感谢这有助于我调试日志丢失跟踪信息的问题。 @Gimpy 的侧边栏:如果要求人们基于他们更好地了解源代码而不是自己阅读和理解完整的源代码来解释“它是如何工作的”是“不道德的”,那么我们可能会现在就禁止所有与 OSS 相关的问题。

以上是关于spring cloud sleuth 如何将跟踪信息添加到 logback 日志行的主要内容,如果未能解决你的问题,请参考以下文章

OpenTelemetry、Spring Cloud Sleuth、Kafka、Jager实现分布式跟踪

Spring Cloud:分布式链路跟踪 Sleuth 与 ZipkinFinchley 版

Spring Cloud Sleuth 介绍

spring-cloud-sleuth-zipkin实现微服务的链路跟踪

Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsear

Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsear