news 2026/1/29 12:52:41

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/1/26 22:32:34

WatchAlert 轻量级AI日志告警 - Docker安装部署

全面兼容主流可观测技术栈监控类型 支持的数据源Metrics Prometheus、VictoriaMetricsLogs Loki、ElasticSearch、VictoriaLogs、ClickHouse、SLS&#xff08;阿里云日志服务&#xff09;、TLS&#xff08;火山云日志服务&#xff0c;开发中&#xff09;、CLS&#xff08;腾讯云…

作者头像 李华
网站建设 2026/1/26 18:25:30

LLM工具调用新体验:SGLang结构化生成的智能革命

LLM工具调用新体验&#xff1a;SGLang结构化生成的智能革命 【免费下载链接】sglang SGLang is a structured generation language designed for large language models (LLMs). It makes your interaction with models faster and more controllable. 项目地址: https://git…

作者头像 李华
网站建设 2026/1/26 17:09:21

14、网络扫描检测与psad应用全解析

网络扫描检测与psad应用全解析 1. UDP扫描特性与检测 UDP扫描相较于TCP扫描,由于UDP协议本身比TCP简单,且不存在类似TCP“连接”的概念,因此其扫描表现没有TCP扫描丰富。不过,iptables仍能追踪与UDP通信相关的数据包,这有助于区分合法的UDP回复和构成UDP扫描的数据包。 …

作者头像 李华
网站建设 2026/1/26 21:59:02

Web安全攻防实战:5大关键场景下的CSRF与XSS防御对决

Web安全攻防实战&#xff1a;5大关键场景下的CSRF与XSS防御对决 【免费下载链接】spring-security Spring Security 项目地址: https://gitcode.com/gh_mirrors/spr/spring-security 作为一名奋战在Web安全前线的开发者&#xff0c;我今天要与你分享在Spring Security战…

作者头像 李华
网站建设 2026/1/26 23:20:39

PaddleSpeech版本管理终极指南:5步实现实验完美复现

PaddleSpeech版本管理终极指南&#xff1a;5步实现实验完美复现 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System…

作者头像 李华
网站建设 2026/1/23 15:55:41

贤风润唐王,精神启新程——千年古镇的文化觉醒与时代交响

贤风润唐王&#xff0c;精神启新程——千年古镇的文化觉醒与时代交响齐鲁大地的晨曦中&#xff0c;唐王镇的青砖黛瓦浸润着千年文脉。这座因唐太宗东征驻跸而得名的古镇&#xff0c;曾以“红白喜事第一镇”的质朴标签隐于乡野&#xff0c;而今却以哲学智慧为笔、文化创新为墨&a…

作者头像 李华