在分布式开发中,经常会遇到程序出现问题定位困难,处理起来耗时耗力,做无用功
下面就来给出一种方案来解决这一问题
| 依赖 | 版本 |
|---|---|
| Spring Boot | 2.4.4 |
| Spring Cloud | 2020.0.2 |
| Spring Cloud Alibaba | 2021.1 |
| Spring Security OAuth2 | 2.3.6 |
| Mybatis Plus | 3.4.2 |
| hutool | 5.6.1 |
| Avue | 2.6.16 |
#日志配置
logging:config: classpath:log/logback.xml
${CONSOLE_LOG_PATTERN} utf8 ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log 10MB 1GB 30 %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n UTF-8 0 256
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);});
2022-12-12 11:02:56.915 [2f61b36c-2eaa-4701-aafe-648eb43e0c40] [pool-2-thread-1] INFO xxx - 上报异常={}