如何将java.util.logging发送到log4j?

2022-08-31 12:02:16

我有一个现有的应用程序,它对log4j进行所有日志记录。我们使用许多其他库,这些库要么也使用log4j,要么对Commons Logging进行日志记录,最终在我们的环境中使用log4j。我们的一个依赖项甚至对slf4j进行日志,这也很好,因为它最终也会委托给log4j。

现在,我想将ehcache添加到此应用程序中,以满足一些缓存需求。以前版本的ehcache使用commons-logging,这在这种情况下可以完美地工作,但是从版本1.6-beta1开始,他们已经删除了对commons-logging的依赖,取而代之的是java.util.logging。

不是很熟悉java.util.logging提供的内置JDK日志记录,有没有一种简单的方法可以让发送到JUL的任何日志消息都记录在log4j上,这样我就可以使用我现有的配置并设置来自ehcache的任何日志记录?

看看 JUL 的 javadocs,看起来我可以设置一堆环境变量来更改使用的实现,也许可以使用它来包装 JUL 类中的 log4j s。这是正确的方法吗?LogManagerLoggerLogger

具有讽刺意味的是,当(大多数)世界其他地区使用第三方库时,库使用内置的JDK日志记录会引起如此头痛。


答案 1

我成功使用的一种方法是使用slf4j作为我的主要日志记录API。然后我有slf4j绑定到log4j。使用其他框架(如 JUL)的第三方依赖项可以桥接到 slf4j。


答案 2

我们在当前的项目中使用SLF4J,它对我们来说效果很好。SLF4J由Log4J的创建者Ceki Gülcü编写,他做得很好。在我们的代码中,我们直接使用 SLF4J 日志记录 API,并配置 SLF4J,以便来自 Jakarta Commons Logging (JCL)、java.util.logging (JUL) 和 Log4J API 的调用都桥接到 SLF4J API。我们需要这样做,因为像您一样,我们使用选择了不同日志记录API的第三方(开源)库。

在 SLF4J 的底部,将其配置为使用特定的记录器实现。它带有一个内部或“简单”记录器,您可以使用Log4J,JUL或Logback覆盖它。只需在类路径中放入不同的 jar 文件即可完成所有配置。

最初,我们使用Logback实现,也是由Ceki Gülcü编写的。这是非常强大的。但是,我们随后决定将我们的应用程序部署到 Glassfish Java EE 应用程序服务器上,该服务器的日志查看器需要 JUL 格式的消息。所以今天我从Logback切换到了JUL,在短短几分钟内,我用一个SLF4J jar替换了两个Logback jar,该jar将其连接到JUL实现。

因此,就像@overthink一样,我衷心建议您在设置中使用SLF4J。


推荐