绑定多个日志实现,会出现警告信息 通过源码来看看其原理(看看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只绑定一个日志实现框架就可以了 绑定多个,默认使用导入依赖的第一个,而且会产生没有必要的警告信息
SLF4J集成多个日志实现出现警告信心分析
最新推荐文章于 2023-01-19 21:06:58 发布