
第三方日志框架优先级
Log4j最高(默认就用这个)
SLF4J次高(上面没有采用这个)
Common Logging(jcl就是common logging)次低(Log4j和SLF4J在项目中均没有就用这个)
JDK log最低(最后的选择)
开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助 全链路追踪ID 把上下文串联起来,本文主要分享基于 Spring Boot + Dubbo 框架下 日志链路追踪ID 的实现方案选型思路。
目前大多数分布式追踪系统的思想模型都来自 Google's Dapper 论文
全链路追踪的核心思想:
这是 SkyWalking 的一个日志插件,通过这个插件可以在日志中输出
traceId
配置依赖 ,在 pom 文件中添加以下内容
配置日志模板 ,修改 logback-spring.xml 文件中 Appender 元素的 encoder 为以下内容
Sleuth 是 Spring Cloud 的组件之一,它为 Spring Cloud 实现了一种分布式追踪解决方案,兼容Zipkin,HTrace与其他日志追踪系统
配置父依赖 ,在 pom 文件中添加以下内容管理版本号
配置依赖 ,在 pom 文件中添加以下内容
适配dubbo ,要让 sleuth 支持 dubbo 框架,需要增加以下两个步骤:
首先添加 dubbo 的插件依赖
配置 dubbo 过滤器
配置日志模板 ,修改 logback-spring.xml 文件中 Appender 元素的 encoder 为以下内容
使用 Logback 的 MDC 机制,在日志模板中加入 traceId 标识,取值方式为 %X{traceId}
解决 traceId 跨线程丢失问题
由于 MDC 内部使用的是 ThreadLocal 所以只有本线程才有效,子线程和下游的服务 MDC 里的值会丢失;
需要解决 Spring 的各种线程池与异步方法的父子线程间传递。
解决思路 :重写一个 MDCAdapter 使用阿里的 TransmittableThreadLocal 替换原来的 ThreadLocal 对象,解决各种线程池( ExecutorService / ForkJoinPool / TimerTask )父子进程传值问题。
解决 traceId 跨进程丢失问题
dubbo服务 使用 org.apache.dubbo.rpc.Filter 创建一个过滤器进行 traceId 传递
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)