当前位置: 首页 > 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.xdnf.cn/news/289549.html

相关文章:

  • 数据库的二级索引
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.4 异构数据源整合(CSV/JSON/Excel数据导入)
  • 数据结构小扫尾——栈
  • BUUCTF 大流量分析(一) 1
  • 比较两种判断相同二叉树的方法:递归与遍历序列对比
  • 湖北理元理律师事务所:债务法律服务的民生价值重构
  • brep2seq kaggle安装 micromamba conda环境
  • 政务服务智能化改造方案和案例分析
  • QT6 源(79):阅读与注释表盘 QDial 的源码,其是基类QAbstractSlider 的子类,及其刻度线的属性举例
  • 深入理解 CSS Flex 布局:代码实例解析
  • 【Hive入门】Hive安全管理与权限控制:基于SQL标准的授权GRANT REVOKE深度解析
  • kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程
  • 用Python打造自己的专属命令行工具
  • 手写 Vue 源码 === reactive 方法
  • 判断题材持续性
  • Redis的过期设置和策略
  • rocketMq win10安装并注册服务 centos7安装
  • 嵌软笔记名词汇总
  • C++基础知识1:内建数据类型 vs 自定义数据类型
  • 豆包多轮对话优化策略:上下文理解与记忆,意图识别,对话管理
  • 力扣每日一题1128等价多米诺骨牌对的数量
  • C++和Lua混和调用
  • 什么是加油站专用可燃气体磁吸无线检测探测器
  • 小米刷新率 2.4 | 突破屏幕刷新率限制,享受更流畅视觉体验的应用程序
  • 《类和对象(上)》
  • 架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
  • 直方图比较
  • SecureCRT 使用指南:安装、设置与高效操作
  • springboot+mysql+element-plus+vue完整实现汽车租赁系统
  • 文本三剑客试题