原创

Skywalking、logback及logstash整合之trace信息输出

温馨提示:
本文最后更新于 2022年11月24日,已超过 11 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

本篇内容比较简单,但是涉及到一点坑,所以记录说明一下。

1. 去哪里查找资料信息?

skywalking官方的信息很多,但是,查找具体的配置信息确并不是太容易。

官方的网站为:https://skywalking.apache.org/

下载地址(这里我们直接选择归档地址,因为包含所有版本,主页面只有最新的几个):https://archive.apache.org/dist/skywalking/

配置地址(这里的版本是8.6.0,其他版本类似):https://github.com/apache/skywalking-java/blob/v8.6.0/docs/en/setup/service-agent/java-agent/Application-toolkit-logback-1.x.md

 

2. 为什么会选择8.6.0?

由于我们之前agent使用的是8.0.1版本,所以toolkit也就选择了8.0.1,但是,在做trace信息输出的时候发现,该版本只能输出tid,别的信息根本没办法输出。而查看官方的release notes,我们发现在8.4.0的时候才增加了spanId等信息的输出。但是,在8.4.0的版本的配置说明中,并没有对应的配置。而最早有该配置的版本为8.6.0,所以,这里我们就选择了该版本。

3. Json格式的输出

因为我们原有的logback配置中,使用了<encoder class="net.logstash.logback.encoder.LogstashEncoder">这个encoder输出Json格式的日志,这是原日志收集时约定的格式。所以,这个Json形式的输出是不能变的。在国内网上流传的traceId及TID输出的方式基本都是使用

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">

这个是不满足我们的需求的。

4. 关于agent和toolkit

toolkit的版本必须与Agent相一致,因为toolkit获取的一些信息都是来自于agent织入的,如果不一致,则可能出现获取不到的情况,比如上面说的8.4.0之前没有输出spanId,那么即使toolkit使用了8.6.0的版本,输出的结果依然为空。

另外,agent在官网很容下载到,但是,toolkit在下载的压缩包中并没有找到,官网也没有看到哪里可以下载toolkit。所以,这里我们直接从maven仓库下载:https://search.maven.org/artifact/org.apache.skywalking/apm-toolkit-logback-1.x/8.6.0/jar

5. pom.xml引入包

<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.6.0</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.9</version>
</dependency>

6.  具体的集成配置

这里的配置可以参考我上面提到的配置地址,那个是当前版本的配至说明。

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!--日志文件存储位置 -->
<property name="LOG_FILE_PATH" value="/tmp/log/"/>

<!--启动日志与控制台日志文件-->
<property name="JSON_LOG_FILE_NAME" value="spring_applog"/>

<!--单个日志文件最大100M-->
<property name="MAX_FILE_SIZE" value="100MB"/>

<!--最大归档时间 30 -->
<property name="LOG_FILE_MAX_HISTORY" value="30"/>

<!--最大日志总量 -->
<property name="LOG_FILE_TOTAL_SIZE" value="10GB"/>

<!--jmx log信息提供给Spring Boot Admin-->
<jmxConfigurator/>

<conversionRule conversionWord="tid" converterClass="org.apache.skywalking.apm.toolkit.log.logback.v1.x.LogbackPatternConverter"/>
<!-- add converter for %sw_ctx -->
<conversionRule conversionWord="sw_ctx" converterClass="org.apache.skywalking.apm.toolkit.log.logback.v1.x.LogbackSkyWalkingContextPatternConverter"/>

<!-- 输出spring运行日志到统一日志平台的配置 -->
<appender name="STASH" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 输出spring日志到 /tmp/log/spring_log.json -->
<file>${LOG_FILE_PATH}${JSON_LOG_FILE_NAME}.json</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}${JSON_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.json</fileNamePattern>
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory>
<totalSizeCap>${LOG_FILE_TOTAL_SIZE}</totalSizeCap>
</rollingPolicy>

<!-- 将日志输出成 JSON格式,并包含预定义 logType: spring_applog -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeCallerData>false</includeCallerData>
<!-- add TID(traceId) field -->
<provider class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.logstash.TraceIdJsonProvider" />
<!-- add SW_CTX(SkyWalking context) field -->
<provider class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.logstash.SkyWalkingContextJsonProvider">
</provider>
</encoder>

<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"level": "%level",
"tid": "%tid",
"skyWalkingContext": "%sw_ctx",
"thread": "%thread",
"class": "%logger{1.}:%L",
"message": "%message",
"stackTrace": "%exception{10}"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>

<root level="info">
<appender-ref ref="STASH"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

其中,%sw_ctx就包含了类似spanId等信息。

正文到此结束