之前定位dubbo+nacos问题的时候,查看dubbo源码,发现许多日志并未打印出来,后续查看dubbo源码发现dubbo日志特殊性,在此记录下。
1.问题描述
dubbo启动的时候有很多日志并未打印在控制台,比如
启动日志中并未出现
2.问题原因
dubbo框架有一个日志适配工厂LoggerFactory
其中有一个静态方法:
它会从VM中读取dubbo的log配置,然后适配对应的日志框架。但一般项目都未设置这个VM参数,所以它会走到default中。他这个默认的逻辑是会按照优先级从高到低加载日志框架:Log4j > Slf4j > Log4j2 > Jcl >jdk
我们项目用的是logback也就是slf4j,正常来说会使用slf4j的适配器,但是因为其他框架引入了log4j,然后dubbo根据优先级使用了log4j的适配器,又因为我们项目中并未配置log4j的配置文件,因此dubbo的启动日志丢失了。
可能有人有疑问dubbo.application.logger这个不是指定了日志的适配器嘛?
其实dubbo启动日志和运行日志是分开的,启动日志适配器是走的静态代码块加载的,直到后面ApplicationConfig初始化他才会读取配置文件中的日志适配器进行替换。
3.解决方案
在VM中添加-Ddubbo.application.logger=slf4j
或者手动排除其他日志框架的包
处理完成后日志就能正常显示了