SpringBoot使用TraceId實現(xiàn)日志鏈路追蹤的步驟
- 業(yè)務(wù)需求
保證一次服務(wù)調(diào)用,在業(yè)務(wù)中可以一次追查到本次服務(wù)調(diào)用涉及的本地服務(wù)方法,第三方服務(wù)接口。實現(xiàn)日志的鏈路追蹤。保證日志的高查找性。
- 實現(xiàn)步驟
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 (日志配置文件)
關(guān)鍵代碼:[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>
<!--保留天數(shù)-->
<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鏈路追蹤
業(yè)務(wù)邏輯是基于線程數(shù)據(jù)的傳遞進行處理,主線程傳遞線程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、異步定時任務(wù)線程接口ScheduledExecutorService的日志鏈路追蹤。在執(zhí)行前,執(zhí)行后進行跟蹤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);
// 為定時任務(wù)生成一個 traceId
TraceIdUtil.setTraceId();
// 可選:添加任務(wù)標識
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();
}
};
}到此這篇關(guān)于SpringBoot使用TraceId日志鏈路追蹤的文章就介紹到這了,更多相關(guān)SpringBoot TraceId日志鏈路追蹤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Agent 動態(tài)修改字節(jié)碼詳情
這篇文章主要介紹了Java Agent動態(tài)修改字節(jié)碼的相關(guān)資料,需要的朋友可以參考下面文章具體的內(nèi)容2021-09-09
java連接SQL?Server數(shù)據(jù)庫的超詳細教程
最近在java連接SQL數(shù)據(jù)庫時會出現(xiàn)一些問題,所以這篇文章主要給大家介紹了關(guān)于java連接SQL?Server數(shù)據(jù)庫的超詳細教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-06-06
從配置到監(jiān)控詳解SpringBoot微服務(wù)性能優(yōu)化實踐指南
Spring Boot憑借快速開發(fā)、自動化配置和豐富生態(tài),被廣泛用于構(gòu)建微服務(wù),本指南將聚焦Spring Boot微服務(wù)性能優(yōu)化,希望可以幫助大家掌握性能調(diào)優(yōu)要點2025-08-08
SpringBoot和Vue實現(xiàn)動態(tài)二維碼的示例代碼
二維碼在現(xiàn)代社交和營銷活動中被廣泛使用,本文主要介紹了SpringBoot和Vue實現(xiàn)動態(tài)二維碼的示例代碼,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Day16基礎(chǔ)不牢地動山搖-Java基礎(chǔ)
這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
java?LeetCode刷題稍有難度的貪心構(gòu)造算法
這篇文章主要為大家介紹了java?LeetCode刷題稍有難度的貪心構(gòu)造題解示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Java Spring5學(xué)習(xí)之JdbcTemplate詳解
這篇文章主要介紹了Java Spring5學(xué)習(xí)之JdbcTemplate詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05

