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

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

作者:享学课堂 2020-05-26 11:59:30

开发

架构

分布式 在现有的系统中,由于大量的其他用户/其他线程的日志也一起输出穿行其中导致很难筛选出指定请求的全部相关日志。那我们如何来处理呢?

 背景

开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用ELK来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,我们来看下面的图:

 

上图一个用户请求一个url,整个链路如图,每个处理层都会产生日志,那我们如何把这些日志串在一些,形成一个请求全路径日志。

在现有的系统中,由于大量的其他用户/其他线程的日志也一起输出穿行其中导致很难筛选出指定请求的全部相关日志。那我们如何来处理呢?

解决思路

我们可以把每个请求弄一个唯一标识,然后我们可以在日志打印的时候代上每个请求都使用一个唯一标识,而且那个唯一标识需要传递给下游服务,下游服务打印日志的时候也带上这个唯一标识,这样就很好的追踪全部的链路显示在日志中。

那技术实现方案是什么呢?我们应该尽可能的对代码无入侵,使用Logback的MDC机制日志模板中加入traceId标识,取值方式为%X{traceId}。

什么是MDC

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

MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。

方案实现

由于MDC内部使用的是ThreadLocal所以只有本线程才有效,子线程和下游的服务MDC里的值会丢失;所以方案主要的难点是解决值的传递问题,主要包括以几下部分:

  • API网关中的MDC数据如何传递给下游服务
  • 服务如何接收数据,并且调用其他远程服务时如何继续传递
  • 异步的情况下(线程池)如何传给子线程

修改日志模板

logback配置文件日志格式添加该标识

 

网关添加过滤器

此过滤器就是来解决网关如何把MDC的数据传递给下游服务:

生成traceId并通过header传递给下游服务

 

上面代码有个MDC是属于org.slf4j.MDC中的,下面就是常量的值:

  1. /** 
  2. * 日志链路追踪id信息头 
  3. */ 
  4. String TRACE_ID_HEADER = "x-traceId-header"
  5. /** 
  6. * 日志链路追踪id日志标志 
  7. */ 
  8. String LOG_TRACE_ID = "traceId"

下游服务增加spring拦截器

接收并保存traceId的值:

 

下游服务增加feign拦截器

继续把当前服务的traceId值传递给下游服务:

 

解决父子线程传递问题

主要针对业务会使用线程池(异步、并行处理),并且spring自己也有@Async注解来使用线程池,要解决这个问题需要以下两个步骤:

重写logback的LogbackMDCAdapter

由于logback的MDC实现内部使用的是ThreadLocal不能传递子线程,所以需要重写替换为阿里的TransmittableThreadLocal。

TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal 扩展。若希望 TransmittableThreadLocal 在线程池与主线程间传递,需配合TtlRunnable和TtlCallable使用。

 

  • 其他代码与ch.qos.logback.classic.util.LogbackMDCAdapter一样,只需改为调用copyOnInheritThreadLocal变量。

TtlMDCAdapterInitializer类用于程序启动时加载自己的mdcAdapter实现:

 

扩展线程池实现

增加TtlRunnable和TtlCallable扩展:

 

场景测试

测试代码如下:

  1. log.info("测试"
  2. @Async 
  3. public  void test(){ 
  4. log.info("测试1"
  5. userService.findByUserName("gu"); 

api网关打印的日志

 

ELK聚合日志通过traceId查询整条链路日志

当系统出现异常时,可直接通过该异常日志的traceId的值,在日志中心查询该请求的所有日志信息,类似下图:

 

总结

到此分布式的日志跟踪就已经完成了,这样就很好的可以排查整个微服务的日志链路,谢谢!!!

作者:享学课堂

链接:https://www.jianshu.com/p/a3ebc9249b69

来源:简书

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/285992.html<

(0)
运维的头像运维
上一篇2025-05-15 03:44
下一篇 2025-05-15 03:46

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注