document.write("");

skywalking 8.8.0 logback 堆栈信息中打印 追踪ID

前提:

        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.8.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.8.0</version>
        </dependency>

目前堆栈信息中不会包含traceId(网上的一些相关博文,在8.8.0无法直接使用,所以单独列出写了一篇)

但在接入阿里云的SLS之后,阿里云SLS的接口是根据关键词搜索日志,导致根据追踪ID,报错信息只能看到一行,剩余的堆栈信息都看不到,只能在SLS网页中查看相关日志的上下文才能确认实际的堆栈错误信息。

https://api.aliyun.com/api/Sls/2020-12-30/GetLogs?sdkStyle=dara&RegionId=cn-shanghai
https://api.aliyun.com/product/Sls

相关接入SLS的步骤我就不赘述了,直接看官网示例,有对应的依赖以及示例代码(注意,如果是内网,需要确认Endpoint的值,网址如上)

代码:

package com.xxx.config;

import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.ThrowableProxyUtil;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;

/*
* 堆栈日志添加追踪ID
* */
public class CustomTraceableConverter extends ThrowableProxyConverter {
    @Override
    protected String throwableProxyToString(IThrowableProxy tp) {
        StringBuilder sb = new StringBuilder();
        String traceId = TraceContext.traceId();
        // 获取标准输出
        String[] stackLines = ThrowableProxyUtil.asString(tp).split("\n");
        for (String line : stackLines) {
            if (!traceId.isEmpty()) {
                sb.append("[").append(traceId).append("] ").append(line).append("\n");
            } else {
                sb.append(line).append("\n");
            }
        }
        return sb.toString();
    }
}

logback.xml中的部分(引入了自定义的Converter类,且在pattern中,添加了%customEx)

<configuration debug="false" scan="false">
    ...
    <conversionRule conversionWord="customEx" converterClass="com.xxx.config.CustomTraceableConverter"/>
    ...
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{sw_ctx}] [%thread] %-5level %logger{36} -%msg%n%customEx</pattern>
            </layout>
        </encoder>
    </appender>
    ...
    <root level="info">
        <appender-ref ref="console"/>
        ...
    </root>
</configuration>

  

 

posted @ 2025-06-27 09:06  人间春风意  阅读(41)  评论(0)    收藏  举报