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

mat*_*t b 83 java logging log4j apache-commons slf4j

我有一个现有的应用程序,它针对log4j进行所有日志记录.我们使用了许多其他库,它们也使用log4j,或者记录Commons Logging,最终使用我们环境中的log4j.我们的一个依赖项甚至记录了slf4j,它也可以正常工作,因为它最终也会委托给log4j.

现在,我想为这个应用程序添加ehcache以满足一些缓存需求.以前版本的ehcache使用了commons-logging,它在这种情况下可以很好地工作,但是从版本1.6-beta1开始,它们已经删除了对commons-logging的依赖,而是用java.util.logging替换它.

不熟悉java.util.logging提供的内置JDK日志记录,是否有一种简单的方法可以将针对log4j发送到JUL的任何日志消息记录下来,因此我可以使用现有配置并设置任何日志记录来来自ehcache?

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

具有讽刺意味的是,当世界其他地方(大部分)使用第三方库时,图书馆使用内置JDK日志记录会引起如此头疼.

ove*_*ink 36

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

  • 很好的链接,但我认为你的意思是#jul-to-slf4j (2认同)
  • 另外,我无法相信像ehcache这样流行的库会切换到像java.util.logging这样的东西 - 看起来非常愚蠢 (2认同)

Jim*_*ans 19

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

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

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

就像@overthink一样,我衷心建议在你的设置中使用SLF4J.

  • Ceki需要多少次重新发明一个日志框架/ fascade? (8认同)
  • @mP,slf4j是必要的,因为Sun在JUL做的糟糕工作.Logback是log4j的一个分支,而不是一个新项目. (3认同)
  • 我发现logback是必要的,如果没有别的,它不是Apache,它实际上是记录在案的. (3认同)

Emm*_*urg 12

有一个比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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

然后用于:

<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>
Run Code Online (Sandbox Code Playgroud)

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

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. 编辑pom.xml,用log4j替换对log4j:log4j:1.2.15的依赖:apache-log4j-extras:1.2.17并删除对apache-log4j-component的依赖
  3. mvn包

  • 我认为它更简单,因为它可以在不更改代码的情况下完成,您只需添加系统属性即可.SLF4J尚未提出类似的机制,您可以更改代码或`logging.properties`文件. (4认同)
  • 警告!`jul-log4j-bridge` 使用从未发布的 `apache-log4j-companions` 包(从废弃的 `log4j 1.3` 向后移植)。你将很难构建它。当然,桥本身也在发布前就被废弃了。 (2认同)

Adr*_*nRM 8

2014年10月

由于log4j的2.1版本存在组件log4j-jul,它允许这一点.但是,如果您使用的是log4j 1,则必须可以升级到log4j2才能使用此方法.

JDK日志记录适配器

类LogManager

从log4j 1.x迁移到log4j 2

  • 截至目前(2018 年年中),这应该是公认的答案 (2认同)