Java日志与Log4J的区别

151

对于一个Java 5项目,是否还值得添加log4j库来记录例如一些异常到文件中并设置一些良好的滚动设置呢?还是标准的util.logging工具也能完成这项工作?

您认为呢?


请参考https://dev59.com/2HA65IYBdhLWcg3w-jum#13144054,以考虑多个log4j 1.2锁定问题。 - Vadzim
7个回答

127

根据您所述的需求,util.logging 对您应该已经足够了。

想要一个好的决策树,请查看Log4j vs java.util.logging

问题一: 您是否预计需要 Log4j 拥有但 JUL 没有的任何聪明的处理程序,例如 SMTPHandler、NTEventLogHandler 或任何非常方便的 FileHandlers?

问题二: 您是否认为自己需要频繁切换日志输出格式?您是否需要一种简单、灵活的方式来实现这一点?换句话说,您是否需要 Log4j 的 PatternLayout?

问题三: 您是否预计在编译和部署到生产环境后,需要更改应用程序中的复杂日志记录配置的能力?您的配置是否与“此类的严重消息通过电子邮件发送给支持人员;来自另一子集类的严重消息被记录到我们服务器上的 syslog 守护进程中;来自另一子集类的警告消息被记录到网络驱动器 A 上的文件中;然后来自任何地方的所有消息都被记录到网络驱动器 B 上的文件中”相似?而且您是否看到自己每隔几天就要微调一下配置?

如果您对上述任何问题的回答是肯定的,那么选择 Log4j。如果您对所有问题都是否定的,JUL 将足以胜任,并且方便地已经包含在 SDK 中。

话虽这么说,几乎每个项目现在似乎都会包括 log4j,即使只是因为其他库使用它。


1
伟大的基于问卷的答案。因人而异,基于需求。 - HopeKing
1
Log4j vs java.util.logging的链接已经失效。 - Prachi
2
更换为wayback机器的一个。 - Matt Sheppard

45

我建议您使用Java简单日志门面(SLF4J)。它支持包括Log4J在内的不同提供者,并可用作Apache Commons Logging的替代。


6
Commons Logging有什么问题? - Bart van Heukelom
6
@Bart van Heukelom以及点赞评论的人们-请阅读http://articles.qos.ch/thinkAgain.html。 - Stephen C
4
@Stephen C:感谢提供信息,虽然我之前就了解了这个,现在我尽可能使用SLF4J。 (顺便说一句,我的评论是一个真正的问题,不是一个保守的评论) - Bart van Heukelom
1
@Bart,Commons Logging使用动态发现要使用的包。SLF4J需要(或曾经需要)在后端加载类才能使用。 - Thorbjørn Ravn Andersen

23

Log4j已经存在很长时间了,而且工作得非常好。虽然我没有科学研究来支持它,但根据我在大量客户处看到的情况,它很容易成为使用最多的日志框架,而其他框架却没有替代它。它已经存在很长时间,也没有被下一个大型日志框架所取代,这说明了一些问题。

设置起来非常简单,并且可以轻松学习基本的附加程序(输出)。有许多可用的附加程序,包括:

  1. ConsoleAppender
  2. DailyRollingFileAppender
  3. ExternallyRolledFileAppender
  4. FileAppender
  5. JDBCAppender
  6. JMSAppender
  7. NTEventLogAppender
  8. RollingFileAppender
  9. SMTPAppender
  10. SocketAppender
  11. SyslogAppender
  12. TelnetAppender
  13. WriterAppender

此外还有其他的。编写自己的appender也不难。此外,每个appender都具有很大的灵活性,允许您控制日志中特定的输出内容。

需要注意的是,在我同时使用apache commons logging和log4j时,我遇到了一系列的ClassLoader问题。虽然这只发生在一个特定的应用程序中,但我发现仅使用log4j比使用诸如commons logging之类的抽象层更简单。

有关更多详细信息,请参见此文章

祝好运!


18

java.util.logging提供了一套全面的日志记录包,没有其他日志记录包提供的多余组件。


6
此外,它默认包含并且被Java本身使用(因此您无论如何都会拥有它!) - Has QUIT--Anony-Mousse

7

log4j是一个更好的整体包,不像java.util.logging那样容易出现问题。我同意直接使用log4j比使用commons logging更容易。


4
请更具体地说明 java.util.logging 遇到了什么问题? - alkber
当然,就像记录同步方法时的开销一样:请参阅https://github.com/playframework/playframework/issues/6958和https://bugs.openjdk.java.net/browse/JDK-8077846。 - Will Sargent

4
我建议使用Apache Commmons Logging作为您的日志记录接口。这样,您就可以灵活地在任何时候切换日志记录实现,而无需对您的代码进行任何更改。

3

我会选择log4j。log4j的可能性并不过时!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接