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


· TA获得超过5.7万个赞

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

你對这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

这里将对如何在自己的项目里面開启dubbo框架自己的日志并对输出的日志进行控制。在讲这些之前先看看dubbo在处理日志的时候是怎么做的?  

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

上面说的有和没有是指你的项目classpath下面有没有对应的jar包如果有则表示支持对应的日志实现。下面粘贴出Dubbo选择日志提供方的代码:

上面这段静态块是在LoggerFactory里面说明只要LoggerFactory类一加载就会去选择对应的日誌提供方。大家可能会发现对日志的提供方其实是可以通过配置来指定的因为静态块一开始是从当前jvm环境中获取dubbo.application.logger,这个参数是同java -Ddubbo.application.logger=xxxx去指定嘚如果是放在容器里面,就需要配置在容器启动的jvm参数里面上面介绍了dubbo中日志相关的实现。下面讲讲在项目总怎么来让dubbo能够在项目里媔输出日志   一、你项目当前使用的是Log4j来提供日志输出   恭喜你,你不用做过多的处理就可以开启dubbo的日志因为dubbo默认就是使用log4j。你唯一需要莋的就是配置一个name是"com.alibaba.dubbo"的logger就可以了然后关联到对应的appender。如下:  

二、你的项目当前使用的是非Log4j来提供日志输出 这种情况默认是看不到dubbo的日誌输出的,除非出现异常被你当前系统的日志框架拦截住了。我这里就拿当前使用最多的日志框架logback来做示例我们知道logback天生和slf4j进行了集荿,所以要在项目里面使用logback调用slf4j暴露的接口就可以。所以要把dubbo的日志输出切换到logback也就变成了切换到slf4j了。一下列举出几种情况来切换   1)通过设置jvm启动参数来指定slf4j   这个方式最简单,但是也很粗暴因为你需要在jvm启动参数上动手脚,这样导致对于项目部署来说不是方便   2)當前项目只依赖slf4j和logback的包,并没有依赖log4j的包   这个就需要严格确定不能存在log4j的相关接口的包,这个排查起来可能比较痛苦如果使用maven那就更痛苦了,因为你可能会间接的依赖log4j的包更可恶的就是有些jar包把log4j的接口直接打到它自己的包里面,这种“捆绑销售”让我们很为难如果排查清楚了,确定没有log4j那么这是最好了。   3)编程方式来指定slf4j   这种方式貌似比第一种更粗暴但是如果遇到了那种"捆绑销售"的现象,我们還能怎么办呢这里的编程方式是怎么来实现的呢?我们从上面知道dubbo在选择日志提供方的时候是在static块里面那么就说明是在加载LoggerFactory的时候去選择的。首先他是会检查jvm环境中是否配置了"dubbo.application.logger"参数如果配置了则使用指定的日志提供方。那么这里的切入点就是要在加载LoggerFactory之前往jvm里面设置"dubbo.application.logger"參数虽然这种方式和第一种类似,但是这种方式对于应用来说更加的灵活要在加载LoggerFactory之前植入这个参数,就需要知道什么时候加载LoggerFactory这个類的既然LoggerFactory是dubbo里面的,那就是启动dubbo框架之前设置肯定可以由于大部分场景都是dubbo+spring的方式,所以这里就通过spring来做这件事情吧我做了下面一件事情:  

加载中,请稍候......

以上网友发言只代表其个人观点不代表新浪网的观点或立场。

我要回帖

 

随机推荐