117

为什么要使用以下软件包之一而不是另一个?

  • Java 日志记录
  • 公共记录
  • 日志4j
  • SLF4j
  • 回溯
4

8 回答 8

88

按 api 出现的时间顺序(据我所知):

  • Log4j,因为大多数人都使用它(根据我的经验)
  • Commons Logging,因为开源项目使用它(因此它们可以与集成解决方案中使用的任何日志框架集成);如果您是 API/Framework/OSS 并且您依赖于使用 Commons Logging 的其他包,则尤其有效。
  • Commons Logging,因为您不想“锁定”到特定的日志记录框架(因此您锁定了 Commons Logging 为您提供的内容) - 我认为决定使用这一点作为原因是不明智的。
  • Java 日志记录,因为您不想添加额外的 jar。
  • SLF4j 因为它比 Commons Logging 更新并提供参数化日志记录:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Logback 因为它比 log4j 更新,并且再次支持参数化日志记录,因为它直接实现了 SLF4j
  • SLF4j/Logback 因为它是由做 log4j 的同一个人编写的,所以他做得更好(根据Ken G - 谢谢。在查看他们早期的新闻帖子时似乎很合适)
  • SLF4j,因为他们还发布了一个 log4j 适配器,因此您不必在旧代码中“切换” log4j - 只需让 log4j.properties 使用 SLF4j 及其配置
于 2008-12-10T01:50:10.060 回答
38

我发现 Java 中的日志记录令人困惑、不一致、记录不充分,而且特别随意。此外,这些日志框架之间存在大量相似性,导致重复工作,并且对您实际所处的日志环境感到困惑。特别是,如果您在一个严肃的 Java Web 应用程序堆栈中工作,您通常会处于一次记录环境;(例如hibernate 可以使用log4j 和tomcat java.util.logging)。Apache commons 旨在连接不同的日志框架,但实际上只是增加了更多的复杂性。如果你不提前知道这一点,那是完全令人困惑的。为什么我的日志消息没有打印到控制台等?哦,因为我正在查看 Tomcat 日志,而不是 log4j。再增加一层复杂性,应用程序服务器可能具有可能无法识别特定 Web 应用程序的本地配置的全局日志记录配置。最后,所有这些日志框架都太复杂了。用 Java 登录一直是一团混乱,让像我这样的开发人员感到沮丧和困惑。

Java 的早期版本没有导致这种情况的内置日志框架。

于 2009-03-11T21:26:48.120 回答
22

有一个重要的点之前没有提到:

SLF4J(以及作为日志后端的 Logback 和 LOG4J)支持所谓的映射诊断上下文(MDC,请参阅javadoc文档)。

这本质上是一个线程本地 Map<String,String> ,您可以使用它向日志事件添加额外的上下文信息。MDC 的当前状态附加到每个事件。

如果您将用户名和请求的 URL(在 webapp 的情况下)等内容放入其中,这将非常有用。例如,这可以使用过滤器自动完成。

于 2009-06-03T04:01:03.423 回答
17

另请参阅问题的答案记录错误的最佳做法是什么?, 尤其:

  • Commons Logging 存在一些潜在的类加载问题。

  • Log4J 和 SLF4J 是由同一个人开发的,从 Log4J 实践中发现的问题中学习。

于 2008-12-10T13:30:10.597 回答
4

在我们公司的项目中,我们使用 LOG4j,它非常易于使用,就像 Stephen 在他的示例中展示的那样。我们还为 LOG4j 编写了自己的模式类,因此您可以创建自己的输出文件模式。您可以描述您的日志文件的外观。可以增强原始 log4j 类。

您可以在 log4j.properties 文件中更改所有 LOG4j 属性,因此您可以为不同的项目使用不同的文件。

Java 日志记录不是我最喜欢的,但这可能是因为我从一开始就使用 log4j。

于 2008-12-10T07:15:55.503 回答
4

Commons Logging 概述给出了它存在的原因:当您无法控制底层日志记录框架时,从库代码进行日志记录。对于将链接到外部应用程序的各种 Apache 项目非常重要。也许对于您可以完全控制的内部 IT 项目来说并不那么重要。

也就是说,我写信给 Commons Logging,我认识的许多其他开发人员也是如此。原因是为了尽量减少心理负担:您可以更改项目或工作,而不必学习新框架(假设新工作/项目也使用 CL,和/或您可以说服他们转向它)。

此外,围绕您使用的任何框架创建自己的包装器都有一些价值。如此处所述,我喜欢使用 LogWrapper 对象来提供自定义字符串化(重要),并尽量减少日志语句的视觉混乱(不太重要)。

于 2008-12-11T13:48:50.047 回答
2

通常我会默认使用 Log4J。

如果我不介意对 Java 1.4 的依赖,我会使用 Java Logging,但我仍然会优先使用 Log4J。

如果我要增强已经使用过的东西,我会使用 Commons Logging。

于 2008-12-10T04:00:46.333 回答
0

我建议创建一个可以写入任何日志框架的精简日志外观,此时支持引擎的选择几乎成为一个有争议的问题。

于 2008-12-10T04:02:16.440 回答