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

Pat*_*čin 2 logback spring-boot spring-cloud-sleuth

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

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

<include resource="org/springframework/boot/logging/logback/base.xml"/>
Run Code Online (Sandbox Code Playgroud)

我想开始记录跟踪信息,所以我补充道:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*oni 6

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

如果您查看sleuth 文档日志集成部分,您将看到示例中的跟踪信息介于日志级别 ( ERROR) 和 pid ( 97192) 之间。如果您尝试将其与logback 配置相匹配,您将看到日志级别和 pid 之间没有任何内容:${LOG_LEVEL_PATTERN:-%5p} ${PID:- }因此跟踪信息如何到达那里可能是一个有效的问题。

如果你再看看文档,它说:

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

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

把自己的logging.pattern.level财产

基于此,您可以认为日志级别和 pid之间没有任何内容,Sleuth 只是覆盖了日志级别并将跟踪信息放入其中。如果您搜索文档中在代码中提到的属性,您会发现它正是发生的事情

TL; 博士

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

map.put("logging.pattern.level", "%5p [${spring.zipkin.service.name:" + "${spring.application.name:}},%X{traceId:-},%X{spanId:-}]");
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这帮助我调试了日志丢失跟踪信息的问题。@Gimpy 的侧边栏:如果要求人们基于对源代码的更好了解来解释“它是如何工作的”,而不是我们自己阅读和理解完整的源代码是“不道德的”,那么我们不妨禁止所有与 OSS 相关的问题从现在开始。 (2认同)