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。
jcl-over-slf4j-1.7.5.jar
,但我希望它使用SLF4J?或其他什么?jul-to-slf4j-1.7.5.jar
?这里的“to”一词与“over”的使用方式有何不同?答案 0 :(得分:11)
首先,这些jar适用于您的项目具有无法控制的依赖项的情况,并且这些依赖项使用JUL
(java.util.logging),JCL
({{ 3}})或log4j
,您希望通过slf4j-api
路由所有日志记录操作。可以将其视为动态替换所有具有slf4j-api
等效的旧式日志记录api的调用。
这3个罐子中的每一个都为其各自的遗留日志框架做同样的事情。命名( over vs to )的差异源于此翻译的完成方式。
考虑到上述问题,以下是您的问题的答案:
如果代码在您的控制之下,您也可以使用正确的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 名称。
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。
over 和 to 之间的区别现在应该很明显。 over jar通过将原始jar的相同类替换为将所有日志记录路由到slf4j-api
的jar来工作。 JUL
到 jar不需要执行相同类的重写,因为JUL
使用处理程序的方式(并且您只需配置一个将路由的处理程序)所有记录到slf4j-api
)。
有关更多旧版笔记,请查看优秀的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 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。对于其他桥接模块,这种开销根本不是必需的。