SLF4J集成多个日志实现出现警告信心分析

绑定多个日志实现,会出现警告信息
通过源码来看看其原理(看看slf4j的执行原理)

进入到getLogger
看到Logger logger = getLogger(clazz.getName());

进入重载的getLogger
ILoggerFactory iLoggerFactory = getILoggerFactory(); 用来取得Logger工厂实现的方法

进入getILoggerFactory()
看到以双重检查锁的方式去做判断
执行performInitialization(); 工厂的初始化方法

进入performInitialization()
bind()就是用来绑定具体日志实现的方法

进入bind()
看到Set集合Set<URL> staticLoggerBinderPathSet = null;
因为当前有可能会有N多个日志框架的实现
看到staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();

进入findPossibleStaticLoggerBinderPathSet()
看到创建了一个有序不可重复的集合对象
LinkedHashSet staticLoggerBinderPathSet = new LinkedHashSet();
声明了枚举类的路径,经过if else判断,以获取系统中都有哪些日志实现
看到Enumeration paths;
if (loggerFactoryClassLoader == null) {
    paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
} else {
    paths = loggerFactoryClassLoader.getResources(STATIC_LOGGER_BINDER_PATH);
}

我们主要观察常量STATIC_LOGGER_BINDER_PATH
通过常量我们会找到类StaticLoggerBinder
这个类是以静态的方式绑定Logger实现的类
来自slf4j-JDK14的适配器
进入StaticLoggerBinder
看到new JDK14LoggerFactory();
进入JDK14LoggerFactory类的无参构造方法
看到java.util.logging.Logger.getLogger("");
使用的就是jul的Logger

接着观察findPossibleStaticLoggerBinderPathSet
看到以下代码,表示如果还有其他的日志实现
while(paths.hasMoreElements()) {
    URL path = (URL)paths.nextElement();
    将路径添加进入
    staticLoggerBinderPathSet.add(path);
}

回到bind方法
表示对于绑定多实现的处理
reportMultipleBindingAmbiguity(staticLoggerBinderPathSet);
如果出现多日志实现的情况
则会打印
Util.report("Class path contains multiple SLF4J bindings.");

总结:
    在真实生产环境中,slf4j只绑定一个日志实现框架就可以了
    绑定多个,默认使用导入依赖的第一个,而且会产生没有必要的警告信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值