spring-boot - Spring sleuth with SpringBoot(日志相关) - Traceid & SpanId 未显示
问题描述
我有一个现有的 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(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %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 %C{1.} [%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-%d{yyyy-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 文件或任何其他配置可能有什么问题吗?配置中是否缺少任何内容?
任何帮助表示赞赏。
解决方案
org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor
Well sleuth 通过覆盖/扩展日志模式的日志级别“字段”(内部)将 traceId 和 spanId 获取到日志中
所以在defaults.xml
(在 中导入base.xml
)spring 定义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.40logger{39}){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列出了应用程序。(属性|yml)字段来调整spring-boot日志记录特性。
例如,我有自定义BaggageFields
传播下游和我的 application.properties 以在日志文件中查看它们我定义应用程序属性如下:(我没有定义自定义 logback.xml!)
对于侦探 2.0+
logging:
pattern:
level: "%5p [${spring.zipkin.service.name:${spring.application.name:-}},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] [%X{ddd:-},%X{bp:-},%X{bpids:-}] [%X{op:-},%X{chunk:-},%X{i:-}]"
对于侦探 3.0+
logging:
pattern:
level: "%5p [${spring.zipkin.service.name:${spring.application.name:}},%X{traceId:-},%X{spanId:-}] [%X{ddd:-},%X{bp:-},%X{bpids:-}] [%X{op:-},%X{chunk:-},%X{i:-}]"
推荐阅读
- ruby-on-rails - 如何将 Rails 共享部分缓存与国际化一起使用
- azure - 在哪种情况下我应该使用来自 Web App Azure Portal 的身份验证链接,在哪种情况下我必须使用 MSAL 库
- kotlin - 出于某种原因设置
没有“包含” - linux - 自动使用所需的监视器和相应的音频输出
- angular - SignalR 错误类型错误:无法读取未定义的属性“订阅”
- vector - 向量中最常见的术语 - PARI/GP
- java - OpenCensus:通过 POST 请求跟踪传播
- html - 借助 HTML 表格创建发票设计
- reactjs - 反应电影数据库应用程序数据.JSON
- android - Android Studio 按钮单击 If 语句