参考文章:
Simplifying the distinction between SL4J and commons logging
日志那点事儿——slf4j源码剖析
slf4j门面模式实现原理
SLF4J 与 CommonsLogging 原理对比
SLF4J 工作原理
如上图示意
- slf4j 会在 classpath 中进行扫描, 寻找可用于 slf4j 绑定的日志实现类库
- 如果只找到一个可用于绑定的日志类库, 就会正常进行绑定, 在运行过程中, 将所有面向 slf4j 的调用翻译为对应的日志实现类库调用
- 如果存在多个可用于绑定日志类库, 就会提示报错
Commons Logging工作原理
如上图示意
- Commons Logging 有一个神奇的逻辑层, 会首先去尝试在 commons-logging.properties 配置文件中查找是否已经设置了
org.apache.commons.logging.log property
这一属性 或者在应用内存中查找是否已经通过 Commons Logging API 设置过这一属性。- 如果找到, 则用 Commons Logging 的日志实现类
- 如果没找到, 在 classPath 中查找是否有 log4j 实现, 有则使用
- 如果还没找到, 直接尝试用 JDK1.4 以上的内置日志实现
- 如果JDK 低于1.4, 则 使用 CommonsLog 中的SimpleLog 实现
优劣对比
SLF4J 的优点在于其策略足够简单, 在拥有maven, gradle 等此类依赖管理工具时, 我们可以很方便的确定, 最终日志的实现
Common Logging 的优点在于当类路径中存在多个日志实现库(jar)时 , 它有一个确定的规则最终选出一个实现类, 而不会因为多个实现类库的共同存在而报错无法完成绑定
由于目前maven, gradle 等构件工具完全可以高效清晰地帮助我们管理项目的依赖, SLF4J 在绑定策略的简单性上,给我们减少了很多出错的可能, 以及查错的成本, 综合来看, SLF4J 因其机制简单清晰的特点更容易被广泛使用