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

项目生成日志链路id,traceId

Trace

1. 注册filter

package com.sc.account.config;import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<TraceFilter> traceFilterRegistration() {FilterRegistrationBean<TraceFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new TraceFilter());registration.addUrlPatterns("/*");registration.setName("TraceFilter");registration.setOrder(100011); // 可设置优先级return registration;}
}

2.创建注册的filter

package com.sc.account.config;import cn.hutool.core.util.IdUtil;
import com.common.result.TraceUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;public class TraceFilter  extends OncePerRequestFilter {public static  Logger logger = LoggerFactory.getLogger(TraceFilter.class);@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String tranceId = IdUtil.fastSimpleUUID();TraceUtils.setTraceId(tranceId);logger.info("请求路径start:{}", request.getRequestURI());long start = System.currentTimeMillis();try {filterChain.doFilter(request, response);} finally {long end = System.currentTimeMillis();logger.info("请求end:{},耗时:{}", request.getRequestURI(),(start - end));TraceUtils.removeTraceId();}}
}

3.ControllerLogAspect 打印请求 参数 和返回值

package com.sc.account.config;import cn.hutool.json.JSONUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import java.util.LinkedHashMap;
import java.util.Map;@Aspect
@Component
@Order(10002)
public class ControllerLogAspect {
private Logger loger =  LoggerFactory.getLogger(ControllerLogAspect.class);@Around("execution(* com.sc.account.domain.index.controller..*.*(..))")public Object around(ProceedingJoinPoint joinPoint){long start = System.currentTimeMillis();MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Object result = null;try {loger.info("接口方法:{},{}",methodSignature.getDeclaringTypeName(),methodSignature.getName());Map<String, Object> logParamMap = new LinkedHashMap<>();String[] parameterNames = methodSignature.getParameterNames();Object[] args = joinPoint.getArgs();for (int i = 0; i < args.length; i++) {String parameterName = parameterNames[i];Object parameterValue = args[i];logParamMap.put(parameterName, parameterValue);}loger.info("接口入参:{}", JSONUtil.toJsonStr(logParamMap));result = joinPoint.proceed();return result;} catch (Throwable e) {throw new RuntimeException(e);}finally {loger.info("方法返回值:{}",JSONUtil.toJsonStr(result));}}}

4. logback.xml加上

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder charset="UTF-8"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [traceId:%X{traceId}] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder>
</appender>
http://www.dtcms.com/a/173102.html

相关文章:

  • 使用 Semantic Kernel 快速对接国产大模型实战指南(DeepSeek/Qwen/GLM)
  • 家政平台派单系统设计与实现详解
  • Unity-Shader详解-其四
  • BUUCTF——Mark loves cat
  • CloudCompare 中 ccDrawableObject
  • 健康养生:从微小改变开始
  • 2025系统架构师---论软件可靠性设计范文
  • yolo 用roboflow标注的数据集本地训练 kaggle训练 comet使用 训练笔记5
  • 从零开始学Python:开启编程新世界的大门
  • C++ 适配器模式详解
  • uniapp 云开发全集 云数据库
  • 11.施工监测
  • 【项目】基于ArkTS的网吧会员应用开发(1)
  • NHANES指标推荐:ZJU index
  • 作者新游戏1.1
  • 什么是外联模板(extern template)?
  • 解锁现代健康密码:科学养生新主张
  • Qt中的UIC
  • 【机器学习-线性回归-5】多元线性回归:概念、原理与实现详解
  • 数据库的二级索引
  • 2022年全国青少年信息素养大赛 Python编程挑战赛 小学/初中组 初赛真题答案详细解析
  • 直方图比较
  • Web前端开发:Grid 布局(网格布局)
  • RGB三原色
  • Notebook.ai 开源程序是一套工具,供作家、游戏设计师和角色扮演者创建宏伟的宇宙 - 以及其中的一切
  • 多线程-探索
  • volatile 关键字应用大全
  • 民主与民族主义作为暴力时代的财政策略
  • 基于SRS实现流媒体服务器(最简单的流媒体服务器)
  • Vite 的工作流程