A-A+
日志追踪
对于分布式系统,在某些场景下不但需要知道异常发生的位置,可能还需要知道异常发生时的上下游情况。
如果在日志中加入唯一标识来对上下游的信息进行分类,可以简单的满足日常的需要。
有两个开源项目实现了这个需求,分别是:
//TLog
https://gitee.com/bryan31/TLog.git
//日志链路追踪
https://gitee.com/ganbing518/trace.git
这两个项目的核心原理其实是一样的,都是通过Slf4j的MDC实现全局TraceId的记录和输出。
TLog更加完备一些,提供的功能更加丰富一些;日志链路追踪这个项目要相对来说简单一些。
具体的框架使用不在此详述了,这里简单介绍一下实现的原理。
1. 基于Http Web的实现。
可以基于Filter或者Spring Interceptor实现,具体的执行过程如下图:
对于SpringMVC的项目来说,大多数情况下,Filter和Interceptor二选一即可。
2. 基于Dubbo的实现
基本的实现原理是:继承Dubbo的Filter,然后遵循它的SPI机制实现自动注入和拦截。
3. 基于线程的实现
必须依赖于线程池实现,通过自定义线程池,在提交线程任务的时候,将主线程的MDC变量写入至子线程的MDC中,相当于做了一个代理类。
此外还有Feign的实现,大概原理一样,只是我日常没怎么用过,所以直接贴个代码:
//也是set header
requestTemplate.header("TraceId", traceId);
本来以为年底忙,结果发现年初更忙,天天的感觉就是困。
发这篇之前,又发现了一个项目,貌似更加完整一些,有空再看吧,仓库地址如下:
https://gitee.com/frankchenlong/plumelog.git
以上,如有错误,欢迎指正。
