Spring sleuth with Spring Boot(日志相关) - Traceid 和 SpanId 未显示

Posted

技术标签:

【中文标题】Spring sleuth with Spring Boot(日志相关) - Traceid 和 SpanId 未显示【英文标题】:Spring sleuth with SpringBoot (log correlation) - Traceid & SpanId Not displayed 【发布时间】:2020-08-08 04:29:32 【问题描述】:

我有一个现有的 Spring boot (2.2.0) 应用程序并尝试集成 Spring cloud sleuth 以获取自动跟踪和 span id。 logback文件如下-

<configuration>

<property name="LOGS" value="./logs" />

<appender name="Console"
          class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %black(%dISO8601) %highlight(%-5level) [%blue(%t)] %yellow(%C1.): %msg%n%throwable
        </Pattern>
    </layout>
</appender>

<appender name="RollingFile"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>$LOGS/spring-boot-logger.log</file>
    <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>%d %p %C1. [%t] %m%n</Pattern>
    </encoder>

    <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily and when the file reaches 100 MegaBytes -->
        <fileNamePattern>$LOGS/archived/spring-boot-logger-%dyyyy-MM-dd.%i.log
        </fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
</appender>

<!-- LOG everything at specified level level -->
<root level="info">
    <appender-ref ref="RollingFile" />
    <appender-ref ref="Console" />
</root>

此 logback 配置未按预期记录/显示 traceId。 据我所知,除了更新 pom.xml 之外不需要其他任何东西,如下所示 -

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth</artifactId>
            <version>2.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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

令人惊讶的是,如果我在 logback 配置中包含以下内容 -

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

traceid、spanid 和应用程序名称显示在控制台上。可能来自 base.xml 配置。

知道我的 logback 文件或任何其他配置可能有什么问题吗? 配置中是否缺少任何内容?

感谢任何帮助。

【问题讨论】:

【参考方案1】:

侦探通过覆盖/扩展日志模式的日志级别“字段”(org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor 内部)将 traceId 和 spanId 获取到日志中

所以在defaults.xml(在base.xml 中导入)弹簧将pattern 定义为:

    <property name="CONSOLE_LOG_PATTERN" value="$CONSOLE_LOG_PATTERN:-%clr(%d$LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS)faint %clr($LOG_LEVEL_PATTERN:-%5p) %clr($PID:- )magenta %clr(---)faint %clr([%15.15t])faint %clr(%-40.40logger39)cyan %clr(:)faint %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx"/>

如您所见,如果变量LOG_LEVEL_PATTERN 被定义,它就是被使用的变量(然后在TraceEnvironmentPostProcessor 中覆盖/扩展,如果没有,它默认为默认级别模式%5p

所以如果你包含base.xml,侦探将无法将日志级别模式“调整”为LOG_LEVEL_PATTERN,那么模式中就不存在了。

正如文档所述 (https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-logging),您始终应该在自定义 logback.xml 中包含 base.xml,这样就可以了。

不推荐: 尝试将您的日志级别模式定义为 $LOG_LEVEL_PATTERN:-%5p 而不仅仅是 %5p%-5level (但如果您问我,包含 base.xml 的解决方案是正确的解决方案。

另外:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-custom-log-configuration 列出了 application.(properties|yml) 字段以从属性调整 spring-boot 日志记录。

例如我有自定义 BaggageFields 用于向下游传播,我的 application.properties 可以在日志文件中查看它们我定义应用程序属性如下:(我定义自定义 logback.xml!)

用于侦探 2.0+

logging:
  pattern:
    level: "%5p [$spring.zipkin.service.name:$spring.application.name:-,%XX-B3-TraceId:-,%XX-B3-SpanId:-,%XX-Span-Export:-] [%Xddd:-,%Xbp:-,%Xbpids:-] [%Xop:-,%Xchunk:-,%Xi:-]"

用于侦探 3.0+

logging:
  pattern:
    level: "%5p [$spring.zipkin.service.name:$spring.application.name:,%XtraceId:-,%XspanId:-] [%Xddd:-,%Xbp:-,%Xbpids:-] [%Xop:-,%Xchunk:-,%Xi:-]"

【讨论】:

谢谢。我已经添加了我使用的解决方案。它只是使用 LOG_LEVEL_PATTERN 下提供的默认格式。您的自定义格式更加灵活。【参考方案2】:

如果有人在那里寻找解决方案,我可以通过以下更改获得它 - 将以下内容添加到您的 logback-spring.xml

 <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

然后在您的日志模式中使用以下变量 -

%clr($LOG_LEVEL_PATTERN:-%5p)

例如:-

<Pattern>%d %clr($LOG_LEVEL_PATTERN:-%5p) %clr(%-40.40logger39) %clr([%20.20t]) %clr(:) %m%n</Pattern>

希望这对某人有所帮助。

【讨论】:

以上是关于Spring sleuth with Spring Boot(日志相关) - Traceid 和 SpanId 未显示的主要内容,如果未能解决你的问题,请参考以下文章

spring boot with p6spy sleuth traces 解读

spring-cloud-sleuth 与 spring-amqp 集成

Spring Cloud Sleuth + zipkin 实现服务追踪

spring-cloud-sleuth与spring-amqp集成

bean 'spring.sleuth.baggage-keys' 已经定义

Spring CloudSpring Cloud之Spring Cloud Sleuth,分布式服务跟踪