当前位置: 首页 > news >正文

springboot项目添加请求链路追踪日志traceId

前言:

在springboot项目中,我们想要知道一次请求,从开始到结束的控制台的所有日志,方便快速区分与第二次请求的日志,我们就需要加入traceId链路追踪日志。

注意:此方法只适用于单项目单线程使用,如果用到多线程如ThreadPoolTaskExecutor(文章末尾有解决方案),traceId会断联,因为 MDC 底层是 ThreadLocal —— 数据只跟当前线程走。还有在分布式微服务,从A服务发送请求到B服务,请求到达B服务的时候源traceId就会丢失,在B服务就会产生新的traceId。所以你是分布式微服务项目还是建议用SkyWalking/Zipkin等专业的APM,如果只是简单的开发调试,这种方式够用了

下面开始上代码,2步搞定:

一,生成并放入 MDC

以下代码可以放入你的项目工具类包中:

import cn.hutool.core.lang.UUID;
import org.slf4j.MDC;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Component
@Order(-1)   // 保证最先执行
public class TraceIdFilter extends OncePerRequestFilter {public static final String TRACE_ID = "traceId";@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws ServletException, IOException {// 1. 优先取网关传过来的 traceId,没有则新生成String traceId = request.getHeader(TRACE_ID);if (traceId == null || traceId.isEmpty()) {// hutool 无横杠traceId = UUID.randomUUID().toString(true);}// 2. 放入 MDC,后续日志模板里 %X{traceId} 自动打印MDC.put(TRACE_ID, traceId);// 3. 返回给前端/下游,方便链路追踪response.setHeader(TRACE_ID, traceId);try {chain.doFilter(request, response);} finally {MDC.clear();   // 防止线程复用串号}}
}

二,在你的项目日志文件中添加traceId配置

我项目中的日志文件是logback.xml,你看你自己的项目日志文件是那个,将以下配置替换即可

<!-- 原来 -->
<property name="log.pattern"
value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>

<!-- 加上 traceId 占位符 -->
<property name="log.pattern"
value="%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{20} - [%method,%line] - %msg%n"/>

主要是添加了:[%X{traceId}] 

可以先比对一下你日志文件中是否有log.pattern下的%d{HH:mm:ss.SSS} 这一段文本,然后比对一下除[%X{traceId}] 其他的文本是否一样,如果一样,你就可以直接将以下配置复制粘贴替换就文本:

<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}]  %logger{20} - [%method,%line] - %msg%n" />

三,演示效果

重启项目,随便请求一个接口

四,拓展:多线程ThreadPoolTaskExecutor解决traceId断联

@Bean
public ThreadPoolTaskExecutor executor() {ThreadPoolTaskExecutor exec = new ThreadPoolTaskExecutor();exec.setCorePoolSize(8);exec.setMaxPoolSize(16);exec.setQueueCapacity(200);exec.setThreadNamePrefix("async-");// ========== 把主线程 MDC 复制到子线程 ==========exec.setTaskDecorator(runnable -> {Map<String, String> context = MDC.getCopyOfContextMap();   // 快照return () -> {if (context != null) MDC.setContextMap(context);try {runnable.run();} finally {MDC.clear();        // 执行完清掉}};});exec.initialize();return exec;
}

到此结束!!!

http://www.dtcms.com/a/399988.html

相关文章:

  • 网站建化网站开发外包业务怎么接
  • 网页源代码 企业网站源码 html源码网站
  • IGBT反压限制
  • 做团购网站视频石家庄网络营销
  • 南宁本地有几家网站开发网站建设技术人员要会什么
  • 项目实战:RAG论文阅读助理系统性能测试
  • 【生态系统植被净初级生产力NPP】CASA(Carnegie-Ames-Stanford Approach)模型原理及应用
  • 济南门户网站建设网站建设菜单栏设计
  • 文昌品牌网站建设费用域名关键词查询
  • 整体设计 逻辑全链 之7 受控的自然语言-字面拼凑:正则表达式 之1
  • ABC424A-E题解
  • 基于深度学习的双对数坐标曲线转折点识别方法研究
  • 部门网站建设管理制度网站开发部署
  • 孟庆涛:GEO 三大趋势工具到生态,构建生成式 AI 时代的认知主权
  • 如何建一个公司网站WordPress不显示斜杠
  • 家政公司网站建设方案网站建设捌金手指下拉六
  • 北京超市网站建设孝感的网站建设
  • 中国精品课程网站湖南省郴州市有几个县
  • 非参数方法:数据驱动时代 “无分布约束” 的分析利器 —— 技术实践与方法论升华
  • Python typing库的应用与优缺点
  • STM32与7038芯片通过SPI通信读取寄存器数据
  • 跨部门设计评审不足常见的问题有哪些
  • PyTorch 模型构建
  • 网站如何建设与安全管理制度网站建设跟版网
  • Spring Cloud Alibaba快速入门-Sentinel流量控制(FlowRule)
  • 给你一个网站seo如何做百度ai人工智能
  • 网站建设实验步骤盘锦网站建设流程
  • UNet改进(40):CrossTemporalUNet在3D时序数据处理中的应用
  • 计算机组成原理:时序产生器和控制方式
  • 写作助手系统:AI辅助内容创作的技术实现