SLF4J:Bridge vs Migrator JAR

时间:2013-08-30 18:09:45

标签: java logging log4j slf4j java.util.logging

SLF4J(1.7.5,但实际上是任何现代版本)附带了几个“over”(迁移器)JAR:

  • jcl-over-slf4j-1.7.5.jar
  • log4j-over-slf4j-1.7.5.jar

...以及“to”(桥梁)JAR:

  • jul-to-slf4j-1.7.5.jar

根据their docs,迁移者:

  

...从[JCL / log4j]轻松[s]迁移到SLF4J。此jar文件旨在作为[JCL / log4j]的替代品。它实现了[ir]公共API,但在下面使用了SLF4J,因此名称“over”SLF4J。

然而,JUL桥:

  

将所有传入的jul记录路由到SLF4j API。

  1. 当我有使用JCL记录的代码时,是否使用jcl-over-slf4j-1.7.5.jar,但我希望它使用SLF4J?或其他什么?
  2. 我何时会使用jul-to-slf4j-1.7.5.jar?这里的“to”一词与“over”的使用方式有何不同?
  3. 为什么JUL没有“过度”的JAR?为什么JCL和log4j没有“to”JAR?

2 个答案:

答案 0 :(得分:11)

首先,这些jar适用于您的项目具有无法控制的依赖项的情况,并且这些依赖项使用JULjava.util.logging),JCL({{ 3}})或log4j,您希望通过slf4j-api路由所有日志记录操作。可以将其视为动态替换所有具有slf4j-api等效的旧式日志记录api的调用。

这3个罐子中的每一个都为其各自的遗留日志框架做同样的事情。命名( over vs to )的差异源于此翻译的完成方式。

考虑到上述问题,以下是您的问题的答案:

  1. 如果代码在您的控制之下,您也可以使用正确的JCL调用替换所有slf4j-api次调用(对于任何其他旧版框架也是如此)。如果源代码不受您的控制,或者您无法替换它们,则可以在类路径中包含jcl-over-slf4j-1.7.5.jar排除 commons-logging.jar。这是因为jcl-over-slf4j-1.7.5.jar包含重写commons-logging.jar的相同类(或其子集),以便将所有日志记录活动发送到slf4j-api。因此 over 名称。

  2. jul-to-slf4j-1.7.5.jar以稍微不同的方式发挥其魔力 ​​- 因此名称。 JUL使用处理程序。处理程序是扩展java.util.logging.Handler的任何类,用于处理(猜测是什么)日志消息(或JUL术语中的记录)。所以在这种情况下,为了将所有JUL日志记录路由到slf4j-api,我们只需要确保只注册一个这样的处理程序 - SLF4JBridgeHandler(恰好是包含的唯一类)在jul-to-slf4j-1.7.5.jar)。可以找到执行此操作的配置选项Jakarta Commons Logging

  3. over to 之间的区别现在应该很明显。 over jar通过将原始jar的相同类替换为将所有日志记录路由到slf4j-api的jar来工作。 JUL jar不需要执行相同类的重写,因为JUL使用处理程序的方式(并且您只需配置一个将路由的处理程序)所有记录到slf4j-api)。

  4. 有关更多旧版笔记,请查看优秀的slf4j here文档,并确保查看legacy(也链接到主要旧版文章)。

    希望这有帮助。

答案 1 :(得分:0)

  

当我有使用日志的代码时,我是否使用jcl-over-slf4j-1.7.5.jar?   JCL,但我希望它使用SLF4J?或其他什么?

如果要将应用程序从使用JCL迁移到SLF4J,则应使用jcl-over-slf4j.jar。 JCL和SLF4J都可以作为各种日志框架的简单外观或抽象,例如Log4J。 SLF4J被认为是比JCL更好的解决方案,因为它解决了与JCL发现机制相关的各种classloading issues。请注意,JCL的1.1版本包含一些旨在解决这些类加载问题的更改 有几种用例需要用SLF4J替换JCL:

  • 解决与公共记录相关的类加载器问题
  • 您意识到SLF4J是比JCL更好的日志门面
  • 您希望使用原生实现SLF4J API的logback

虽然您可以通过使用SLF4J API调用替换JCL API调用来完全替换JCL与SLF4J的使用,但是通过SLF4J实现的JCL将允许您逐渐迁移到SLF4J,特别是如果您的软件所依赖的某些库继续使用JCL(例如Spring Framework)。

  

我何时会使用jul-to-slf4j-1.7.5.jar?这里的“to”这个词怎么样?   使用不同于“结束”?

如果您的应用程序使用jul-to-slf4j-1.7.5.jar(JUL)作为其日志框架,您应该使用java.util.logging,并且您希望将其替换为SLF4J作为日志记录外观,并且可以自由选择其他记录实现。 JUL提供了JavaTM 2平台核心日志记录工具的类和接口。与重新实现JCL的jcl-over-slf4j相反,jul-to-slf4j模块不会重新实现java.util.logging,因为java。*命名空间下的包不能被替换。相反,jul-to-slf4j包含一个java.util.logging(jul)处理程序,即SLF4JBridgeHandler,它将所有传入的jul记录路由到 SLF4j API。请注意SLF4J的注释与此解决方案的性能有关。

  

为什么JUL没有“过度”的JAR?为什么JCL没有“到”JAR   和log4j?

如前一节所述,java。*命名空间下的包不能被替换,因此不可能创建“from”桥接模块,而是使用将JUL API调用路由到 SLF4J。对于其他桥接模块,这种开销根本不是必需的。