本文主要讲解了spring cloud微服务使用Feign作为微服务间的通讯框架的情况下,如何使用统一的日志ID来追踪一次请求日志,高效排查日志。核心解决了以下问题:

1.代码无入侵

2.线程池(主/子线程)日志ID一致

3.日志ID传递到下游服务

(以下只提供了核心代码截图,详细代码可通过github、gitee仓库查看,文末附代码目录)

一、单体服务统一日志ID处理

MDC(Mapped Diagnostic Context,映射调试上下文)是log4j和logback提供的一种方便在多线程条件下记录日志的功能。MDC可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。

1.创建一个MDC工具类MdcUtil

2.利用Filter在请求入口设置日志ID(如果是下游服务,可以从header获取到日志ID,否则生成新的日志ID)

3.使用logback的MDC机制日志模板中加入日志ID标识,取值方式为%X{trace-id}

4.使用postman请求API

【日志打印效果】16582427033635607为日志ID

22:58:23.365 [16582427033635607] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":"2022-07-19 22:58:23"}
22:58:23.368 [16582427033635607] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/time header:{"x-platform":"app"},param:{"a":"1"},body:{"b":"bb"},4ms

二、日志ID传递给线程池中的子线程

1.自定义线程池实现JDK的ThreadPoolExecutor,在提交任务的时候把日志ID绑定到Runnable一起提交,后续执行Runnable的run方法的时候可以通过成员变量的方式获取日志ID

三、微服务链路日志ID传递(基于Feign)

1.利用Feign提供的拦截器RequestInterceptor,在Feign请求发起前往RequestTemplate设置header就OK了

2.由于加入了Hystrix做熔断处理,需要解决Hystrix线程池(主/子线程)的日志ID传递,重写HystrixConcurrencyStrategy构建线程池的逻辑

【当前服务的日志】16582448303481157为日志ID

​23:33:50.365 [16582448303481157] [hystrix-template-user-10]  INFO FeignIPClient.execute[42] - 13ms GET http://192.168.31.158:8002/user/getById?id=1
23:33:50.370 [16582448303481157] [http-nio-6001-exec-3]  INFO FeignCostTimeAspect.feignCostTime[30] - request feign:UserFeign.getById,mills:19,args:[1],result:{"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.373 [16582448303481157] [http-nio-6001-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.377 [16582448303481157] [http-nio-6001-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /api/getUserById header:{"x-platform":"app"},param:{"id":"1"},body:{},29ms

【user服务的日志】16582448303481157为日志ID

23:33:50.363 [16582448303481157] [http-nio-8002-exec-3]  INFO LogResponseBodyAdvice.beforeBodyWrite[32] - {"code":0,"message":"成功","data":{"id":1,"name":"adasd","status":2,"statusDesc":"冻结"}}
23:33:50.366 [16582448303481157] [http-nio-8002-exec-3]  INFO RequestFilter.doFilterInternal[52] - GET 192.168.31.158 /user/getById header:{"x-platform":"app"},param:{"id":"1"},body:{},6ms

怎么样?如果你觉得有用的话,还不快快搞起!!!

附:涉及的代码目录

github:GitHub - 897665787/springcloud-template

gitee:springcloud-template: 一个基于springcloud netflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。

springcloud-template
└── template-framework└── filter└── MdcFilter -- 对客户端请求添加MDC└── MdcUtil -- MDC工具└── interceptor└── FeignHeaderInterceptor -- Feign调用过程中传递header值└── Transfer -- http请求线程与Hystrix线程 传输对象└── TransferHystrixConcurrencyStrategy -- Hystrix并发策略└── threadpool└── CustomThreadPoolExecutor -- 自定义线程池└── logback-conf-base.xml -- 基础日志配置

如果想了解如何高效收集请求/响应日志,可阅读我的文章

微服务分布式架构中,如何高效收集请求/响应日志_吾日三省Java的博客-CSDN博客

微服务分布式架构中,如何实现日志链路跟踪?相关推荐

  1. 微服务分布式架构中,如何实现日志链路跟踪

    摘要:接口设计出来返回结果值和编码,还有哪些是需要我们优化的结果参数?微服务分布式架构中,如何实现日志链路跟踪? 本文分享自华为云社区<微服务分布式架构中,如何实现日志链路跟踪?>,作者: ...

  2. 微服务分布式架构中,如何高效收集请求/响应日志

    本文主要讲述了spring cloud微服务使用Feign作为微服务间的通讯框架的情况下,如何配置统一的日志打印,能更直观地在日志中收集有效信息. (以下只提供了核心代码截图,详细代码可通过githu ...

  3. 全网疯传,阿里 P8 技术官的架构笔记外泄:微服务分布式架构实践手册

    前言 阿里 P8 大佬的架构笔记:微服务分布式架构实践手册从企业的真实需求出发,理论结合实际,深入讲解 Spring Cloud 微服务和分布式系统的知识. 整份笔记共分为 4 部分: 第一部分:概述 ...

  4. 一文详解微服务分布式架构

    本文将介绍微服务架构和相关的组件,介绍它们是什么以及为什么要使用微服务架构和这些组件.本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节. 要理解微服务,首先要先理解不是微服 ...

  5. 一文详解微服务分布式架构!

    本文将介绍微服务架构和相关的组件,介绍它们是什么以及为什么要使用微服务架构和这些组件.本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节. 要理解微服务,首先要先理解不是微服 ...

  6. SpringCloudAlibaba微服务分布式架构

    一.SpringCloudAlibaba简介 待更新 二.Nacos概述 1.什么是nacos? 一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台,相当于注册中心 + 配置中心的组合,等 ...

  7. 微服务架构 | 如何利用好日志链路追踪做性能分析?

    导读:做性能分析听到最多的歪理就是,服务做水平.垂直扩容.分表分库.读写分离.XX中间件.资源静态化等等但是归根到底这些方案都是为了尽可能减少对数据库的访问以及堆栈的释放,提高数据库IO的读写速度和程 ...

  8. 阿里架构师推荐,微服务分布式构架开发实战PDF,快快收藏吧

    什么是微服务架构 微服务是一种软件架构风格,目标是将一个复杂的应用拆分成多个服务模块,每个模块专注单一业务功能对外提供服务,并可以独立编译及部署,同时各模块间互相通信彼此协作,组合为整体对外提供完整服 ...

  9. 微服务分布式构架开发实战PDF,阿里架构师推荐,快快收藏吧

    什么是微服务架构 微服务是一种软件架构风格,目标是将一个复杂的应用拆分成多个服务模块,每个模块专注单一业务功能对外提供服务,并可以独立编译及部署,同时各模块间互相通信彼此协作,组合为整体对外提供完整服 ...

最新文章

  1. 收藏!深度学习计算机视觉模型解析!
  2. PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字符编码不一致引起的。 检查Oracle服务器端字符编码,用 sel
  3. 三重积分平均值_2015考研数学考前必须死磕的知识点
  4. PowerBI 秒级实时大屏展示方案 全面助力双十一
  5. poj2182 Lost Cows-暴力
  6. [html] html5的游戏引擎你了解多少?都有哪些比较好用的引擎呢?
  7. spring+websocket综合(springMVC+spring+MyBatis这是SSM框架和websocket集成技术)
  8. Windows 10如何连接和使用局域网内的打印机(非网络打印机)亲测有效、绝对管用,不定时更新!!!(更新日期2021.09.14,如有不会的可以直接私我)
  9. python安装dlib要cmake,如何使用cmake解决dlib错误?
  10. maven 相关简介,和操作命令
  11. oracle 常用系统表
  12. 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
  13. Vue3源码解析01--Vue3初探
  14. LARS算法的几何意义
  15. 第一不完全性定理证明标号分类 拆解汉译 知识背景——哥德尔原著英译拆解汉译之一
  16. PHP开发环境搭建和phpinfo函数
  17. ubuntu下配置msmtp+mutt发送邮件
  18. 计算机无法连接iphone,为什么iphone连不上电脑
  19. JMU软件计组期末复习总结
  20. 地缘剧本杀 (五):雨衣人(原创小说连载,内含语音)

热门文章

  1. C++删除文件末尾的空行
  2. 软件测试/测试开发丨学习Docker就应该掌握的dockerfile语法与指令
  3. 教你在python中用不同的方式画不同颜色的画布!
  4. C语言:7-10 计算工资.2021-07-29
  5. iOS 逆向编程(三)实操越狱详细流程
  6. (n++)+(n++)+(n++)与(++n)+(++n)+(++n)的区别
  7. 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记...
  8. 哈尔滨苹果手机不开机怎么办
  9. .NET WebApi实现RSA加密与解密,签名与验签
  10. Python中的对象实例化过程 用python解密__new__