如何开启Dubbo框架内部的日志

如何开启Dubbo框架内部的日志,第1张

在dubbo框架内所有的日志输出都是通过 LoggerFactory这个静态工厂类来获得Logger的对象实体,并且抽离了一个LoggerAdapter用于对接第三方日志框架,所以就有了JDKLoggerAdapter,Log4jLoggerAdapter,SLF4JLoggerAdapter等一些实现子类,分别对接了不同Log第三方实现。既然dubbo能够支持这么多log实现,那么这些实现在dubbo中优先级是在呢么样的呢?这里的优先级是只未配置指定的logger提供方的情况下,由dubbo框架自己选择。优先级如下:

第三方日志框架优先级

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 传递

 

 


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11728440.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存