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

我有一个现有的应用程序,它会对log4j进行所有的日志logging。 我们使用一些其他库,它们也使用log4j,或者loginCommons Logging,最后在我们的环境下使用log4j。 我们的一个依赖关系甚至会logging下slf4j,它也可以正常工作,因为它最终也会委托给log4j。

现在,我想添加ehcache到这个应用程序的一些caching需求。 以前版本的ehcache使用了commons-logging,在这种情况下可以完美工作,但是从版本1.6-beta1开始,他们已经删除了对commons-logging的依赖关系,而是用java.util.logging代替它。

不是很熟悉java.util.logging中可用的内置JDK日志logging,是否有一种简单的方法可以将任何发送给JUL的日志消息logging到log4j中,所以我可以使用现有的configuration并设置任何日志logging从ehcache?

看看JUL的javadoc,看起来我可以设置一堆环境variables来改变使用哪个LogManager实现,也许用它来包装JUL Logger类中的log4j Logger 。 这是正确的方法吗?

有点讽刺的是,一个图书馆使用内置的JDK日志logging会在世界其他地方(大部分)使用第三方库时引起头痛。

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

我们在当前的项目中使用SLF4J ,这对我们来说非常有效。 SLF4J是由Log4J的创始人CekiGülcü撰写的,他做了一个非常棒的工作。 在我们的代码中,我们直接使用SLF4J日志loggingAPI,并且configurationSLF4J,以便来自Jakarta Commons Logging (JCL),java.util.logging(JUL)和Log4J API的调用全部桥接到SLF4J API。 我们需要这样做,因为和我们一样,我们使用select不同日志API的第三方(开源)库。

在SLF4J的底部,您将其configuration为使用特定的logging器实现。 它带有一个内部或“简单”logging器,您可以用Log4J,JUL或Logback覆盖它。 所有configuration都是通过在类path中放入不同的jar文件来完成的。

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

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

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

你只需要把jul-log4j-bridge放在类path上并添加一个系统属性:

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

也可以使用以下步骤从源代码重build它:

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

2014年10月

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

JDK日志logging适配器

类LogManager

从log4j 1.x迁移到log4j 2

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

是的,SLF4J下载包含了我相信的jul-to-slf4j。 它包含一个JUL处理程序将logging传递给SLF4J。

@Yishai – 感谢张贴链接到我的维基。 那里的例子将JULredirect到Log4J,我已经在生产系统中运行了几年。 JBoss 5.x已经将JULredirect到Log4J,所以我们在升级时将其取出。 我有一个更新的redirect到SLF4J,我现在使用一些东西。 当我有机会时,我会发布。

但是,SLF4J已经有了它:

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