找回密码
 立即注册
首页 业界区 业界 SpringBoot使用TraceId日志链路追踪

SpringBoot使用TraceId日志链路追踪

骆熙华 6 小时前

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

  • 实现步骤
  1、pom.xml 依赖
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.springframework.boot</groupId>
  4.         spring-boot-starter-web</artifactId>
  5.     </dependency>
  6.     <dependency>
  7.         <groupId>org.springframework.boot</groupId>
  8.         spring-boot-starter-test</artifactId>
  9.         <scope>test</scope>
  10.     </dependency>
  11.     <dependency>
  12.         <groupId>org.springframework.boot</groupId>
  13.         spring-boot-starter-logging</artifactId>
  14.     </dependency>
  15.    
  16.     <dependency>
  17.         <groupId>org.projectlombok</groupId>
  18.         lombok</artifactId>
  19.         <version>1.16.10</version>
  20.     </dependency>
  21. </dependencies>
复制代码
2、整合logback,打印日志,logback.xml (日志配置文件)

关键代码:[traceId:%X{traceId}],traceId是通过拦截器里MDC.put(traceId, tid)添加。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration debug="false">
  3.    
  4.     <property name="log" value="D:/test/log" />
  5.    
  6.    
  7.         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  8.             
  9.             <pattern>[traceId:%X{traceId}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  10.         </encoder>
  11.     </appender>
  12.    
  13.    
  14.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  15.             
  16.             <FileNamePattern>${log}/%d{yyyy-MM-dd}.log</FileNamePattern>
  17.             
  18.             <MaxHistory>30</MaxHistory>
  19.         </rollingPolicy>
  20.         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  21.             <pattern>[traceId:%X{traceId}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  22.         </encoder>
  23.         
  24.         <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  25.             <MaxFileSize>10MB</MaxFileSize>
  26.         </triggeringPolicy>
  27.     </appender>
  28.    
  29.     <root level="INFO">
  30.         
  31.         
  32.     </root>
  33. </configuration>
复制代码
3、application.yml指定logback.xml配置目录
  1. logging:
  2.   config: classpath:logback.xml
复制代码
4、异步线程的跟踪ID链路追踪

业务逻辑是基于线程数据的传递进行处理,主线程传递线程ID到子线程。处理方式:重写线程池的execute(*)、submit(*)方法。
  1. public final class MyThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
  2.     public MyThreadPoolTaskExecutor() {
  3.         super();
  4.     }
  5.     @Override
  6.     public void execute(Runnable task) {
  7.         super.execute(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));
  8.     }
  9.     @Override
  10.     public <T> Future<T> submit(Callable<T> task) {
  11.         return super.submit(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));
  12.     }
  13.     @Override
  14.     public Future<?> submit(Runnable task) {
  15.         return super.submit(TraceIdUtil.wrap(task, MDC.getCopyOfContextMap()));
  16.     }
  17. }
复制代码
4、异步定时任务线程接口ScheduledExecutorService的日志链路追踪。在执行前,执行后进行跟踪ID的生成和删除。
  1. @Bean(name = "scheduledExecutorService")
  2.     protected ScheduledExecutorService scheduledExecutorService() {
  3.         return new ScheduledThreadPoolExecutor(corePoolSize,
  4.                 new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
  5.                 new ThreadPoolExecutor.CallerRunsPolicy()) {
  6.             @Override
  7.             protected void beforeExecute(Thread thread, Runnable runnable) {
  8.                 super.beforeExecute(thread, runnable);
  9.                 // 为定时任务生成一个 traceId
  10.                 TraceIdUtil.setTraceId();
  11.                 // 可选:添加任务标识
  12.                 System.out.println("Scheduled task starting with traceId: " + TraceIdUtil.getTraceId());
  13.             }
  14.             @Override
  15.             protected void afterExecute(Runnable r, Throwable t) {
  16.                 super.afterExecute(r, t);
  17.                 Threads.printException(r, t);
  18.                 TraceIdUtil.remove();
  19.             }
  20.         };
  21.     }
复制代码
注:萌新一枚,该博客用于记录所学知识,如有不对的地方,请及时指教,谢谢各位。
2025-10-20 15:46:36

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册