Spring boot分布式链路追踪
创始人
2024-05-02 17:32:15

Spring boot分布式链路追踪

      • 前言
        • 演示项目核心依赖
        • 一、系统配置文件 日志文件路径配置
        • 二、日志文件 logback.xml 其中重要的标志是“requestId”字眼
        • 三、配置全局拦截器 RequestIdTraceInterceptor.java 拦截交互请求带有 “requestId” 字眼的值
        • 四、实际使用
        • 五、效果展示 MDC.put下方所有在内的完整日志链路都会出现 如【2f61b36c-2eaa-4701-aafe-648eb43e0c40】字眼,在查询时直接搜索即可

前言

在分布式开发中,经常会遇到程序出现问题定位困难,处理起来耗时耗力,做无用功
下面就来给出一种方案来解决这一问题

演示项目核心依赖

依赖版本
Spring Boot2.4.4
Spring Cloud2020.0.2
Spring Cloud Alibaba2021.1
Spring Security OAuth22.3.6
Mybatis Plus3.4.2
hutool5.6.1
Avue2.6.16

一、系统配置文件 日志文件路径配置

 #日志配置
logging:config: classpath:log/logback.xml

二、日志文件 logback.xml 其中重要的标志是“requestId”字眼


${CONSOLE_LOG_PATTERN}utf8${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log10MB1GB30%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%nUTF-80256

三、配置全局拦截器 RequestIdTraceInterceptor.java 拦截交互请求带有 “requestId” 字眼的值

package com.xxx.interceptor;import cn.hutool.core.util.IdUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 链路追踪*/
@Slf4j
@Component
public class RequestIdTraceInterceptor implements HandlerInterceptor {public static final String REQUEST_ID_KEY = "requestId";@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {MDC.put(REQUEST_ID_KEY, getRequestId(request));return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {//把requestId添加到响应头,以便其它应用使用response.addHeader(REQUEST_ID_KEY, MDC.get(REQUEST_ID_KEY));//请求完成,从MDC中移除requestIdMDC.remove(REQUEST_ID_KEY);}public static String getRequestId(HttpServletRequest request) {String requestId;String parameterRequestId = request.getParameter(REQUEST_ID_KEY);String headerRequestId = request.getHeader(REQUEST_ID_KEY);// 根据请求参数或请求头判断是否有“request-id”,有则使用,无则创建if (parameterRequestId == null && headerRequestId == null) {log.debug("no request-id in request parameter or header");requestId = IdUtil.simpleUUID();} else {requestId = parameterRequestId != null ? parameterRequestId : headerRequestId;}return requestId;}
}

四、实际使用

        String requestId= UuidUtils.generateUuid();//hutool带的线程池方法 可不用ThreadUtil.execAsync(() -> {//添加唯一字眼MDC.put(RequestIdTraceInterceptor.REQUEST_ID_KEY, requestId);try {//业务代码} catch (Exception e) {log.info("异常={}", e);}//请求完成,从MDC中移除requestIdMDC.remove(RequestIdTraceInterceptor.REQUEST_ID_KEY);});

五、效果展示 MDC.put下方所有在内的完整日志链路都会出现 如【2f61b36c-2eaa-4701-aafe-648eb43e0c40】字眼,在查询时直接搜索即可

2022-12-12 11:02:56.915 [2f61b36c-2eaa-4701-aafe-648eb43e0c40] [pool-2-thread-1] INFO  xxx - 上报异常={}

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...