天天看点

《SLF4J官方文档》传统桥接API

通常,有些组件取决或依赖logging api,而不是slf4j。你也可以假设不久的将来这些组件不会转变成slf4j。为了处理这种情况,slf4j装载了几个可以重定向调用的桥接模块,这些模块使得log4j, jcl and java.util.logging apis

表现得仿佛他们是slf4j的代替。下图阐述了这个想法。

《SLF4J官方文档》传统桥接API

jcl-over-slf4j.jar

为了简易从jcl到slf4j的迁移,slf4j分步包含了jar文件jcl-over-slf4j.jar。这个jar文件是用来替代jcl1.1.1版本的。它实现了jcl的公共api,但它用的是slf4j的底层,因此命名为“slf4j上的jcl”.

slf4j上的jcl实现允许你逐渐迁移到slf4j,特别是如果一些软件依赖包在可见的将来继续使用jcl.你可以立即享受slf4j可靠性的益处,同时也保持向后兼容性。只需将common-logging.jar替换为jcl-over-slf4j.jar。随后,底层日志框架的选择将由slf4j完成而不是jcl,但 [没有折磨jcl类加载的头疼]。底层日志框架可以是任何slf4j支持的框架。通常,用jcl-over-slf4j代替common-logging.jar将立即地、永久地解决commons日志相关的类加载问题。

slf4j-jcl.jar

部分我们的用户在转换到slf4j api后意识到在一些环境下,使用jcl是强制的,使用slf4j可能成为问题。在这种不常见但很重要的情况下,slf4j提供一个jcl绑定,在slf4j-jcl.jar中可以找到。jcl绑定将所有的由slf4j产生的日志调用分发给jcl。这样,如果由于某些原因一个已存在的应用必须使用jcl,应用的部分仍可以用透明的方式编码到大的应用环境,而不是slf4j api。你选择的slf4j api将在应用的其余部分不可见,这样你可以继续使用jcl.

jcl-over-slf4j.jar不能和 slf4j-jcl.jar混淆

slf4j上的jcl, 也就是jcl-over-slf4j.jar,在jcl需要支持向后兼容的原因下,它派上了用场。与jcl联系,它可以解决这些问题,没有一定要采取slf4j api,推迟到一段时间后再作决定。

另一方面,在你的组件已经采用了slf4j api后,slf4j-jcl.jar是有用的,你需要把组件嵌入到更大的应用环境中,在这个环境下jcl表面上是需要的。在没有扰乱应用的更大部分,你的软件组件仍可以使用。实际上,slf4j-jcl.jar将分发所有的日志决定给jcl,那样组件依赖的slf4j api将对更大的整体透明。

slf4j装载了一个叫log4j-over-slf4j的模块。它允许log4j用户转移已存在的应用到slf4j,同时不用改变一行代码,只需要简单地用log4j-over-slf4j.jar代替log4j.jar。

它如何工作?

log4j-over-slf4j模块包含了大部分使用的log4j类的替代类,是org.apache.log4j.category, org.apache.log4j.logger, org.apache.log4j.priority,org.apache.log4j.level, org.apache.log4j.mdc, and org.apache.log4j.basicconfigurator.这些被替代类重新把所有的工作指向相关的slf4j类。

在你自己的应用中使用log4j-over-slf4j,第一部是定位,然后用log4j-over-slf4j.jar代替log4j.jar。注意你仍需要slf4j绑定,它是log4j-over-slf4j.jar完全工作的根基。

在大部分情况下,为了从log4j迁移到slf4j,所有的花费只是替换jar文件。

何时工作?

当应用调用不存在于桥接中log4j组件时,log4j-over-slf4j模块将不会工作。比如,当应用代码直接引用log4j输出端,过滤器或者属性配置器,log4j-over0slf4j将不会完全替代log4j。然而,当log4j通过配置文件配置后,变成log4j.properties 或 log4j.xml,log4j-over-slf4j模块应该只是工作良好。

系统开销怎么样?

直接使用log4j-over-slf4j代替log4j的系统开销相对小很多。之前已经给出,log4j-over-slf4j立即分配所有的工作给slf4j, cpu的系统开销在几纳秒内应该忽略不计。有个内存系统开销,对应于每个日志器的hashmap的入口,这个对于有几千个日志器的大应用来说是可以接受的。另外,如果你选择logback作为底层日志系统,已知logback比log4j更快同时更节省内存,使用logback直接代替log4j的增益应该补偿了使用log4j-over-slf4j的过度花费。

log4j-over-slf4j.jar 和slf4j-log4j12.jar二者不能同时存在

如果你关心应用的性能,只有当下列2种情况是真的时,是用slf4jbridgehandler是合适的:

 几乎没有u.l日志声明在运行

2.已安装levelchangepropagator

slf4j-jdk14.jar是jul到slf4j的绑定,将强制slf4j的调用分配给jul。另一方面,jul-to-slf4j.jar,加上slf4jbridgehandler的安装,加上slf4jbridgehandler的安装,通过调用“slf4jbridgehandler.install()“将jul记录发送给slf4j。因此,如果两个jar文件同时存在(slf4jbridgehandler已安装),slf4的调用将被分配给jul, jul记录将发送到slf4j,导致一个死循环。