繁体   English   中英

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

[英]How to send java.util.logging to log4j?

我有一个现有的应用程序,它针对 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包装在 JUL Logger类中。 这是正确的方法吗?

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

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

我们在当前项目中使用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,在短短几分钟内,我用一个 SLF4J jar 替换了两个 Logback jar,将它连接到 JUL 实现。

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

有比 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 包

2014 年 10 月

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

JDK 日志适配器

类日志管理器

从 log4j 1.x 迁移到 log4j 2

我相信 slf4j 站点有一个通过 slf4j 传递 java.util.logging 事件的桥梁(从而传递到 log4j)。

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

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

但是,SLF4J 已经有了:

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

你应该在启动时手动添加 blew

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM