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

如何将java.util.logging发送到log4j?,java,logging,log4j,apache-commons,slf4j,Java,Logging,Log4j,Apache Commons,Slf4j,我有一个现有的应用程序,它根据log4j进行所有日志记录。我们使用了许多其他的库,它们要么也使用log4j,要么根据公共日志记录日志,最终在我们的环境中使用log4j。我们的一个依赖项甚至针对slf4j进行日志记录,这也很好,因为它最终也会委托给log4j 现在,我想将ehcache添加到这个应用程序中,以满足一些缓存需求。早期版本的ehcache使用了commons日志记录,这在这种情况下可以很好地工作,但是到目前为止,他们已经删除了对commons日志记录的依赖,并将其替换为java.uti

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

现在,我想将ehcache添加到这个应用程序中,以满足一些缓存需求。早期版本的ehcache使用了commons日志记录,这在这种情况下可以很好地工作,但是到目前为止,他们已经删除了对commons日志记录的依赖,并将其替换为java.util.logging

由于不太熟悉java.util.logging提供的内置JDK日志记录,是否有一种简单的方法可以根据log4j记录发送到JUL的任何日志消息,以便我可以使用现有配置并设置来自ehcache的任何日志记录

查看JUL的javadocs,看起来我可以设置一组环境变量来更改使用了哪个
LogManager
实现,也许可以使用它在JUL
Logger
类中包装log4j
Logger
s。这是正确的方法吗


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

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

我认为slf4j站点有一座桥梁,可以通过slf4j传递java.util.logging事件(从而传递到log4j)

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

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

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

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


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

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

但是,SLF4J已经有了:


有一种比SLF4J更简单的替代方案,可以使用log4j桥接JUL,请参见

您只需将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>

珀史密斯
http://people.apache.org/~psmith/logging.apache.org/repo
假的
然后用于:

<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>

org.apache.logging

  • 编辑pom.xml,用log4j:apache-log4j-extras:1.2.17替换对log4j:log4j:1.2.15的依赖,并删除对apache-log4j-component的依赖
  • mvn包
  • 2014年10月

    由于log4j的版本2.1存在组件log4j jul,它正好允许这样做。不过,如果您使用的是log4j1,则必须能够升级到log4j2才能使用这种方法


    您应该在启动时手动添加

    SLF4JBridgeHandler.removeHandlersForRootLogger()
    SLF4JBridgeHandler.install()
    

    演示->

    很好的链接,但我认为你的意思是#7月到SLF4j这听起来是个不错的方法,只是我似乎无法让它工作:(另外,我不敢相信像ehcache这样受欢迎的库会切换到java.util.logging这样的东西——这似乎非常有用boneheaded@mattJUL总是出现在Java运行时中,因此它需要最少的外部依赖性。然而,在我看来,它是一个真正的代码示例,由那些没有使用过该co的人编写de.配置系统相当不方便。您遇到的问题是,如果您将SLF4J桥接到JUL,日志记录性能会非常糟糕。具体地说,您创建的每一条日志行都会引发一个异常,以确定要使用哪个日志记录上下文。这会产生大量开销并降低处理速度Ceki需要重新执行多少次发明一个日志框架/fascade?@mP:日志可能并不迷人,但它是大规模商业级软件的关键需求。而SLF4J解决了集成使用不同日志框架的代码的问题(Sun选择开发java.utils.logging而不是采用Log4J使这一问题变得更加紧迫)@mP,slf4j是必要的,因为Sun对JUL做得不好。Logback是log4j的一个分支,不是一个新项目。我发现Logback是必要的,如果没有其他原因,它不是Apache,而且实际上是有文档的。我认为它更简单,因为它可以在不更改代码的情况下完成,您只需添加一个系统属性。slf4j不建议si类似的机制,您可以更改代码或
    logging.properties
    文件。这在日志中不存在