news 2026/4/16 15:25:53

SpringBoot使用TraceId日志链路追踪

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot使用TraceId日志链路追踪

一次服务调用,在业务中可以一次追查到本次服务调用涉及的本地服务方法,第三方服务接口。实现日志的链路追踪。保证日志的高查找性。

实现步骤

1、pom.xml 依赖

复制代码

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-logging</artifactId>

</dependency>

<!--lombok配置-->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.16.10</version>

</dependency>

</dependencies>

复制代码

2、整合logback,打印日志,logback.xml (日志配置文件)

关键代码:[traceId:%X{traceId}],traceId是通过拦截器里MDC.put(traceId, tid)添加。

复制代码

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

<configuration debug="false">

<!--日志存储路径-->

<property name="log" value="D:/test/log" />

<!-- 控制台输出 -->

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

<!--输出格式化-->

<pattern>[traceId:%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

</encoder>

</appender>

<!-- 按天生成日志文件 -->

<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--日志文件名-->

<FileNamePattern>${log}/%d{yyyy-MM-dd}.log</FileNamePattern>

<!--保留天数-->

<MaxHistory>30</MaxHistory>

</rollingPolicy>

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

<pattern>[traceId:%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

</encoder>

<!--日志文件最大的大小-->

<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

<MaxFileSize>10MB</MaxFileSize>

</triggeringPolicy>

</appender>

<!-- 日志输出级别 -->

<root level="INFO">

<appender-ref ref="console" />

<appender-ref ref="file" />

</root>

</configuration>

复制代码

3、application.yml指定logback.xml配置目录

logging:

config: classpath:logback.xml

4、异步线程的跟踪ID链路追踪

业务逻辑是基于线程数据的传递进行处理,主线程传递线程ID到子线程。处理方式:重写线程池的execute(*)、submit(*)方法。

复制代码

public final class MyThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {

public MyThreadPoolTaskExecutor() {

super();

}

@Override

public void execute(Runnable task) {

super.execute(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));

}

@Override

public <T> Future<T> submit(Callable<T> task) {

return super.submit(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));

}

@Override

public Future<?> submit(Runnable task) {

return super.submit(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));

}

}

复制代码

4、异步定时任务线程接口ScheduledExecutorService的日志链路追踪。在执行前,执行后进行跟踪ID的生成和删除。

复制代码

@Bean(name = "scheduledExecutorService")

protected ScheduledExecutorService scheduledExecutorService() {

return new ScheduledThreadPoolExecutor(corePoolSize,

new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),

new ThreadPoolExecutor.CallerRunsPolicy()) {

@Override

protected void beforeExecute(Thread thread, Runnable runnable) {

super.beforeExecute(thread, runnable);

// 为定时任务生成一个 traceId

TraceIdUtil.setTraceId();

// 可选:添加任务标识

System.out.println("Scheduled task starting with traceId: " + TraceIdUtil.getTraceId());

}

@Override

protected void afterExecute(Runnable r, Throwable t) {

super.afterExecute(r, t);

Threads.printException(r, t);

TraceIdUtil.remove();

}

};

}

复制代码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 22:07:50

GSE宏编译器经典版兼容性问题完整解决方案

GSE宏编译器经典版兼容性问题完整解决方案 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. It uses Travis for UnitTests, Coveralls to report on test coverage and the Curse packager to b…

作者头像 李华
网站建设 2026/4/16 15:25:04

16、PSAD:网络安全监测与主动响应的利器

PSAD:网络安全监测与主动响应的利器 一、PSAD基础特性 1.1 扫描数据筛选 PSAD 在工作时十分谨慎,不会将源自 RFC 1918 地址或因 /etc/psad/auto_dl 中危险等级设置为零而应被忽略的地址的扫描数据纳入其中。 1.2 DShield 报告功能 1.2.1 启用建议 虽然 PSAD 默认未启…

作者头像 李华
网站建设 2026/4/16 13:54:01

19、fwsnort:Snort规则转换与网络安全防护

fwsnort:Snort规则转换与网络安全防护 1. 攻击目标与IDS检测 当针对Microsoft IIS Web服务器的攻击指向Apache Web服务器时,攻击不会对目标造成损害。如果入侵检测系统(IDS)检测到此类攻击,其事件严重程度应远低于针对真实IIS服务器的攻击。 2. fwsnort的特性 轻量级资…

作者头像 李华
网站建设 2026/4/11 17:37:39

18、Kubernetes存储与有状态应用管理全解析

Kubernetes存储与有状态应用管理全解析 1. Kubernetes存储管理 1.1 Ceph存储集成 Ceph是一种分布式存储系统,在Kubernetes中有不同的使用方式。Ceph RBD支持ReadWriteOnce和ReadOnlyMany访问模式。若Ceph集群已配置CephFS,则可轻松将其分配给Pod,且CephFS支持ReadWriteMa…

作者头像 李华
网站建设 2026/4/15 19:19:25

ANSYS Workbench摩擦磨损模拟终极教程:5步快速掌握Archard模型

ANSYS Workbench摩擦磨损模拟终极教程&#xff1a;5步快速掌握Archard模型 【免费下载链接】ANSYSWorkbench摩擦磨损实例教程 本资源提供了一份详实的ANSYS Workbench摩擦磨损模拟实例教程&#xff0c;名为《Archard Wear》。教程以简单易懂的方式&#xff0c;逐步讲解如何在AN…

作者头像 李华
网站建设 2026/4/12 12:20:51

23、深入了解 fwsnort 的实际应用

深入了解 fwsnort 的实际应用 在网络安全领域,fwsnort 是一款强大的工具,它能够将 Snort 规则转换为 iptables 规则,从而实现对网络攻击的检测和响应。本文将通过具体的攻击示例,详细介绍 fwsnort 的功能和使用方法。 1. fwsnort 基础概述 fwsnort 构建的策略默认类似于…

作者头像 李华