对 SLF4J 的一点理解
以下内容主要参考 SLF4J FAQ 文档。只用于记录我的一点理解,如有必要请仔细阅读 FAQ 文档。
?
1. 什么是 SLF4J??
SLF4J is a simple facade for logging systems allowing the end-user to plug-in the desired logging system at deployment time.?要理解这句话需要先弄懂几个概念:
SLF4J 提供的接口封装在 slf4j-api.jar 里,另外,SLF4J 还提供了 5 种 binding:slf4j-nop, slf4j-simple, slf4j-log4j12, slf4j-jdk14, 和 logback-classic,每一种 binding 对应了一个 jar。在 SLF4J 的每一个版本的发行包中包括了 slf4j-api.jar 以及 5 种 binding 的 jar。
?
从 SLF4J 使用者的角度看,slf4j-api 是 backward compatible(向后兼容)的,这种兼容意味着当你使用任何版本的 slf4j-api 都可以成功通过编译。但也只是仅此而已,因为你使用 SLF4J 不只是使用 slf4j-api 这一个jar,SLF4J 发行包里的其它 binding jar 对 slf4j-api.jar 的版本存在依赖。对 binding jar 和 slf4j-api.jar 不同版本号的混合使用可能会导致意想不到的错误,因为不同版本的实现存在差异。
?
2. 什么时候应该考虑使用 SLF4J?
由于 SLF4J 为不同的 logging 实现提供了统一的接口,在工程里使用 SLF4J 的好处是,你不必依赖于某个特定的 logging 实现的接口,当你需要换一种 logging 的实现时,只需要简单的替换几个 jar 包,而无须修改散布在代码各处的 logging 接口调用。当然,这种应用场景可能并不常见。对于独立的应用来说,当选用了一种 logging 实现后,很少会去考虑替换为另一种 logging 实现。并且,在独立应用里,即使使用了 SLF4J,也需要调用底层的 logging 实现去完成基本的 logging 操作,毕竟 SLF4J 只是一个 facade。所以,对于独立应用而言,一般不需要使用 SLF4J。
?
SLF4J 这种将统一接口与具体 logging 实现解耦的方式给 API libary 的设计带来的好处是最为明显的。因为,如此一来,API 的最终使用者可以灵活的选用适合自己的底层 logging 实现,要做的也只是引入 SLF4J 的某个 binding jar 而已。