85

我有一个现有的应用程序,它针对 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,看起来我可以设置一堆环境变量来更改LogManager使用的实现,也许可以使用它来将 log4j 包装Logger在 JULLogger类中。这是正确的方法吗?

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

4

7 回答 7

38

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

于 2009-05-15T17:47:08.310 回答
19

我们在当前项目中使用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 文件即可完成所有配置。

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

所以就像@overthink,我衷心推荐在你的设置中使用 SLF4J。

于 2009-05-16T06:38:04.120 回答
15

有一个比 SLF4J 更简单的替代方法来连接 JUL 和 log4j,请参阅http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

您只需将 jul-log4j-bridge 放在类路径上并添加一个系统属性:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager

jul-log4j-bridge 不在 Maven Central 中,可以从这个存储库中获取:

<repository>
  <id>psmith</id>
  <url>http://people.apache.org/~psmith/logging.apache.org/repo</url>
  <releases>
    <enabled>false</enabled>
  </releases>
</repository>

然后与:

<dependency>
  <groupId>org.apache.logging</groupId>
  <artifactId>apache-jul-log4j-bridge</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>log4j</groupId>
      <artifactId>apache-log4j-component</artifactId>
    </exclusion>
  </exclusions>
</dependency>

也可以通过以下步骤从源代码重建它:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. 编辑 pom.xml,将 log4j:log4j:1.2.15 的依赖替换为 log4j:apache-log4j-extras:1.2.17 并删除对 apache-log4j-component 的依赖
  3. mvn包
于 2010-11-30T21:02:53.750 回答
10

2014 年 10 月

由于 log4j 的 2.1 版存在组件 log4j-jul,它完全允许这样做。尽管如此,如果您使用的是 log4j 1,则必须可以升级到 log4j2 才能使用这种方法。

JDK 日志适配器

类 LogManager

从 log4j 1.x 迁移到 log4j 2

于 2014-10-24T10:50:44.880 回答
3

我相信 slf4j 站点有一个通过 slf4j 传递 java.util.logging 事件的桥梁(并因此传递给 log4j)。

是的,SLF4J 下载包含 jul-to-slf4j,我相信它就是这样做的。它包含一个将记录传递给 SLF4J 的 JUL 处理程序。

于 2009-05-15T17:48:14.423 回答
2

@Yishai - 感谢您将链接发布到我的 wiki。那里的示例将 JUL 重定向到 Log4J,我已经让它在生产系统中运行了几年。JBoss 5.x 已经将 JUL 重定向到 Log4J,所以我在升级时将其取出。我有一个更新的重定向到 SLF4J,我现在在一些事情上使用它。当我有机会时,我会发布。

然而,SLF4J 已经有了它:

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j

于 2010-06-21T17:36:19.573 回答
0

您应该在启动时手动添加自爆

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

演示-> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d

于 2018-08-09T10:00:36.403 回答