您现在的位置是:主页 > 数据库技术 > 数据库技术
微服务如何实现简单的分布式日志追踪
IDCBT2022-01-14【服务器技术】人已围观
简介这期内容当中小编将会给大家带来有关微服务如何实现简单的分布式日志追踪,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 最近想给项目
这期内容当中小编将会给大家带来有关微服务如何实现简单的分布式日志追踪,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
最近想给项目添加一个简单的分布式请求跟踪功能,从前端发起请求到网关,再从网关调用 Spring Cloud 的微服务,这些过程中希望能从日志中看到一个分布式 ID 的链路,通过请求的 ID 可以追踪整一条链路,方便问题的排查。
现成的方案自然是使用 SkyWalking 、 Spring Cloud Sleuth 、Zipkin 之类的组件,但是想到主要的目的记录一个可以一直贯通各个服务的 ID,方便日志查询,也就不想引入太多复杂的组件,最终决定通过 MDC 在日志中输出追踪的 ID,然后在 Feign 和 RestTemplate 中将请求 ID 在微服务中传递。
主要包括几个步骤:
从前端生成请求 ID 并加入请求头带入网关
网关通过 WebFilter 拦截并加入 MDC 中,在 log 中输出
在 Feign 和 RequestTemplate 中将请求 ID 在带到 HTTP 的 Header 中微服务传递
各个微服务同样通过 WebFilter 实现拦截并加入 MDC,在 log 中输出
MDC
MDC(Mapped Diagnostic Context,映射调试上下文)是 Log4j 和 Logback 提供的一种方便在多线程条件下记录日志的功能。 MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。
MDC 的关键操作:
向 MDC 中设置值:MDC.put(key, value);
从 MDC 中取值:MDC.get(key);
将 MDC 中内容打印到日志中:%X{key}
新增 TraceId 工具类
先新增一个 TraceIdUtils 工具类,用于定义 TRACE_ID 的常量值以及设置及生成 TRACE_ID 的方法,后续代码中都是通过这个估计类进行操作。
import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.MDC; public class TraceIdUtils { public static final String TRACE_ID = "traceId"; private static final int MAX_ID_LENGTH = 10; /** * 生成 traceId */ private static String genTraceId() { return RandomStringUtils.randomAlphanumeric(MAX_ID_LENGTH); } /** * 设置 traceId */ public static void setTraceId(String traceId) { // 如果参数为空,则生成新 ID traceId = StringUtils.isBlank(traceId) ? genTraceId() : traceId; // 将 traceId 放到 MDC 中 MDC.put(TRACE_ID, StringUtils.substring(traceId, -MAX_ID_LENGTH)); } /** * 获取 traceId */ public static String getTraceId() { // 获取 String traceId = MDC.get(TRACE_ID); // 如果 traceId 为空,则生成新 ID return StringUtils.isBlank(traceId) ? genTraceId() : traceId; } }标签:很赞哦! ()