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

How spring cloud sleuth adds tracing information to logback log lines

我有基于 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%mdchttps://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 parent 带来 Spring Boot 2.3.5.RELEASEspring-cloud-starter-sleuth 2.2.6.RELEASE

(tl;底部的博士)
根据这个问题,我想您已经知道 traceIdspanId 已放入 MDC。

如果您查看 log integration section of the sleuth docs you will see that the tracing info in the example is between the log level (ERROR) and the pid (97192). If you try to match this with the logback config,您会发现日志级别和 pid 之间没有任何内容:${LOG_LEVEL_PATTERN:-%5p} ${PID:- } 因此跟踪信息如何到达那里可能是一个有效的问题。

如果你再看看文档,它是这样说的:

This log configuration was automatically setup by Sleuth. You can disable it by disabling Sleuth via spring.sleuth.enabled=false property or putting your own logging.pattern.level property.

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

putting your own logging.pattern.level property

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

TL;DR

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

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