IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot 代码实现日志打印 traceId -> 正文阅读

[Java知识库]SpringBoot 代码实现日志打印 traceId

背景:在分布式服务架构下,一个 Web 请求从网关流入,有可能会调用多个服务对请求进行处理,拿到最终结果。在这个过程中每个服务之间的通信又是单独的网络请求,无论请求流经的哪个服务除了故障或者处理过慢都会对前端造成影响。

一、相关概念

? 在分布式链路追踪中有两个重要的概念:跟踪(trace)和 跨度(span)。trace 是请求在分布式系统中的整个链路视图,span 则代表整个链路中不同服务内部的视图,span 组合在一起就是整个 trace 的视图。

  • traceId:用于标识某一次具体的请求ID。当用户的请求进入系统后,会在RPC调用网络的第一层生成一个全局唯一的traceId,并且会随着每一层的RPC调用,不断往后传递,这样的话通过traceId就可以把一次用户请求在系统中调用的路径串联起来。

  • **spanId:**用于标识某一次RPC调用在分布式请求中的位置。请求到达每个服务后,服务都会为请求生成spanId。

  • **parent-spanId:**用于标识上游RPC调用在分布式请求中的位置。请求到达每个服务后,随请求一起从上游传过来的上游服务的 spanId 会被记录成 parent-spanId,或者叫 pspanId。当前服务生成的 spanId 随着请求一起,在传到下游服务时,这个 spanId 又会被下游服务当作 parent-spanId 记录。

  • MDC:(Mapped Diagnostic Context)映射诊断环境,是 log4j 和 logback 提供的一种方便在线多线程条件下记录日志的功能,可以看成是一个与当前线程绑定的 ThreadLocal。

    public class MDC {
        // 添加 key-value
        public static void put(String key, String val) {...}
        // 根据 key 获取 value
        public static String get(String key) {...}
        // 根据 key 删除映射
        public static void remove(String key) {...}
        // 清空
        public static void clear() {...}
    }
    

二、设置过滤器

 @Override
 public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException {
     try {
         // 填充数据(适用logback、log4j 1.x)
         MDC.put("traceId", UUID.randomUUID().toString());
         // 填充数据(适用log4j 2.x)
         // ThreadContext.put(Contents.REQUEST_ID, UUID.randomUUID().toString());
         chain.doFilter(request, response);
     } finally {
         // 请求结束时清除数据,否则会造成内存泄露问题
        MDC.remove("traceId");
    }
}

三、设置日志

在 log4j、logback中配置 %X{traceId},即可在日志中打印traceId。

logback设置示例:

    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%clr(%X{traceId}){yellow},%clr(%X{X-B3-TraceId}){yellow}] %clr(%level){blue} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

logback打印示例:

2022-06-04 10:55:44.490 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl Creating a new SqlSession
2022-06-04 10:55:44.496 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6504bfe5] was not registered for synchronization because synchronization is not active
2022-06-04 10:55:44.508 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7deee750] will not be managed by Spring
2022-06-04 10:55:44.515 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl ==>  Preparing: select * from t_user_info where id = ? limit 1
2022-06-04 10:55:44.695 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl ==> Parameters: 111(String)
2022-06-04 10:55:44.737 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl <==    Columns: ID, NAME, CREATE_TIME, UPDATE_TIME
2022-06-04 10:55:44.739 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl <==        Row: 111, ACGkaka, 2022-06-02 19:10:55, 2022-06-02 20:54:33
2022-06-04 10:55:44.749 [aac50971c2aa464987d6309d2dda0781,] INFO org.apache.ibatis.logging.stdout.StdOutImpl <==      Total: 1
2022-06-04 10:55:44.752 [aac50971c2aa464987d6309d2dda0781,] DEBUG com.alibaba.druid.pool.PreparedStatementPool {conn-10001, pstmt-20000} enter cache

整理完毕,完结撒花~




参考地址:

  1. 分布式链路跟踪中定义的traceid和spanid代表什么,https://zhuanlan.zhihu.com/p/374885660
  2. 链路追踪的traceid原理梳理,https://blog.csdn.net/sunyufeng22/article/details/118357503
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 17:56:45  更:2022-06-25 17:57:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:55:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码