logback和log4j日志框架堆栈信息添加TraceId方式

 更新时间:2023年09月27日 09:27:50   作者:lllllLiangjia  
这篇文章主要介绍了logback和log4j日志框架堆栈信息添加TraceId方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

TraceId是我在项目上自定义的,作为链路追踪来使用。至于为什么没有用市面上skywalking此类现成的链路追踪,是因为目前这个项目是boot单体,也不是分布式,不想引入过多比较复杂的依赖项,造成不必要的维护麻烦。

使用traceId只是来准确定位某个请求的日志信息,自己实现的话比较轻量化,也能够满足项目的开发和维护需求。

当请求访问时,被过滤器拦截到,生成一个唯一的traceId存放在MDC中(分布式项目可以通过请求头获取上游服务传过来的traceId),MDC是ThreadLocal类型线程安全的。

日志xml配置写上traceId会自动读取MDC。

logback日志框架

由于之前项目是使用的logback日志框架,如果只在xml日志文件中配置traceId的话,当报错时候输出的堆栈信息内不会保存traceId。

到时候线上排查问题,无法通过grep命令筛选出来报错的堆栈信息,也就不能快速定位代码中的报错位置。

堆栈信息不携带traceId

xml配置文件中的配置

堆栈信息携带traceId

logback想要在堆栈信息中添加traceId需要继承ThrowableProxyConverter,重写里面的方法。

import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.IThrowableProxy;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
public class CompressedStackTraceConverter extends ThrowableProxyConverter {
    public CompressedStackTraceConverter() {
    }
    @Override
    protected String throwableProxyToString(IThrowableProxy tp) {
        String original = super.throwableProxyToString(tp);
        String traceId = MDC.get("traceId");
        if (StringUtils.isBlank(traceId)) {
            traceId = "";
        }
        traceId = "\t[ably-stack]\t[" + traceId + "]";
        return original.replaceAll("\n", traceId + "\n");
    }
}

此时的xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <conversionRule conversionWord="ex"
                    converterClass="com.example.springbootdemo.configuration.httpglobal.CompressedStackTraceConverter"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern xml:space="preserve">
                %d{yyyy-MM-dd HH:mm:ss.SSS}|-|%lsn|-|%thread|-|%X{traceType}|-|%X{traceId}|-|%logger{80}:%L|-|%msg|-|%ex|-|%n
            </pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

这样logback框架就可以打印堆栈信息的时候携带traceId了

log4j日志框架

目前这个新项目使用的log4j这个框架,这里的traceId也是放在MDC中。

堆栈信息不携带traceId

堆栈信息携带traceId

当我配置好traceId后,开始配置堆栈信息中的traceId,发现ThrowableProxyConverter是logback包下面的,无法使用它来添加。

于是我在网上找是否log4j有对应的像logback这种接口可以操作堆栈信息的。无果!(也有可能我没找到)。

后来偶然查到%throwable可以支持更改单个堆栈跟踪元素,我就想可不可以使用它来添加traceId。

通过了解%throwable的常用方法,看到了配合{suffix(pattern)}使用,可以在每个堆栈帧的末尾添加模式输出。

于是抱着试一试的态度就打印traceId,结果是可以的。

对应的traceId在堆栈信息以及主日志中都打印了出来

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IntelliJ IDEA2021.1 配置大全(超详细教程)

    IntelliJ IDEA2021.1 配置大全(超详细教程)

    这篇文章主要介绍了IntelliJ IDEA2021.1 配置大全(超详细教程),需要的朋友可以参考下
    2021-04-04
  • Maven中生命周期的具体使用

    Maven中生命周期的具体使用

    在 Maven 出现之前,项目构建的生命周期就已经存在,本文主要介绍了Maven中生命周期的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SpringRetry重试机制之@Retryable注解与重试策略详解

    SpringRetry重试机制之@Retryable注解与重试策略详解

    本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健壮的应用程序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • IDEA集成JProfiler11可视化工具的详细流程(安装、集成、测试)

    IDEA集成JProfiler11可视化工具的详细流程(安装、集成、测试)

    小编打算在IDEA中集成一下JProfiler11(现在有12版本了)工具,到网上搜都没有找到合适的,于是自己动手写个,关于IDEA集成JProfiler11可视化工具(安装、集成、测试)相关知识感兴趣的朋友一起看看吧
    2021-06-06
  • Java编程BigDecimal用法实例分享

    Java编程BigDecimal用法实例分享

    这篇文章主要介绍了Java编程BigDecimal用法实例分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Spring Boot整合全局异常处理器、junit、多环境、logback的过程

    Spring Boot整合全局异常处理器、junit、多环境、logback的过程

    本文总结了SpringBoot的异常处理、单元测试、多环境配置及日志配置的最佳实践,重点介绍了前后端分离项目中的全局异常处理器,多环境配置文件的应用及激活方式,以及如何使用Logback进行日志记录,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • java利用jieba进行分词的实现

    java利用jieba进行分词的实现

    本文主要介绍了在Java中使用jieba-analysis库进行分词,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Java 在生活中的 10 大应用

    Java 在生活中的 10 大应用

    这篇文章主要给大家分享Java 在生活中的 10 大应用,桌面图形用户界面、移动应用、人工智能、网络应用程序、大数据技术、游戏应用、商业应用、嵌入式系统、云应用、科学应用,下文来看具体应用介绍,需要的朋友可以参考一下
    2021-11-11
  • Java使用反射和动态代理实现一个View注解绑定库

    Java使用反射和动态代理实现一个View注解绑定库

    这篇文章主要介绍了Java使用反射和动态代理实现一个View注解绑定库,代码简洁,使用简单,扩展性强,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Java中Long类型传入前端数值出错问题

    Java中Long类型传入前端数值出错问题

    这篇文章主要介绍了Java中Long类型传入前端数值出错问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论