登录Java有什么用?

时间:2008-12-10 01:27:31

标签: java logging log4j logback slf4j

为什么要使用以下其中一个包而不是另一个呢?

  • Java Logging
  • Commons Logging
  • 的Log4j
  • SLF4J
  • 的logback

8 个答案:

答案 0 :(得分:86)

按照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 - 谢谢。看起来很适合their earlier news posts
  • SLF4j,因为他们也发布了一个log4j适配器,因此您不必在旧代码中“切换”log4j - 只需使log4j.properties使用SLF4j及其配置

答案 1 :(得分:35)

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

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

答案 2 :(得分:22)

以前没有提到过一个重点:

SLF4J(Logback和LOG4J都作为日志记录后端)支持所谓的映射诊断上下文(MDC,请参阅javadocdocumentation)。

这实际上是一个线程局部的Map< String,String>您可以使用它向记录事件添加其他上下文信息。 MDC的当前状态附加到每个事件。

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

答案 3 :(得分:17)

另请参阅问题What are the best practices to log an error?的答案,尤其是:

  • 有一些潜力 用Commons加载类问题 日志记录。

  • Log4J和SLF4J由     从同一个人那里学习     使用Log4J在实践中发现的问题。

答案 4 :(得分:4)

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

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

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

答案 5 :(得分:4)

Commons Logging overview给出了它存在的原因:当你无法控制底层日志框架时,从库代码中记录。对于各种Apache项目非常重要,这些项目将链接到外部应用程序。对于完全控制的内部IT项目而言,这可能并不那么重要。

那就是说,我写信给Commons Logging,就像我认识的许多其他开发人员一样。原因是尽量减少心理负担:你可以改变项目或工作,而不必学习新的框架(如果新的工作/项目也使用CL,和/或你可以说服他们转移到它)。

此外,围绕您使用的任何框架创建自己的包装器都有一定的价值。正如here所述,我喜欢使用LogWrapper对象来提供自定义字符串化(重要),并最大限度地减少日志记录语句的混乱(不太重要)。

答案 6 :(得分:2)

通常我会默认使用Log4J。

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

如果我正在增强已经使用它的东西,我会使用Commons Logging。

答案 7 :(得分:0)

我建议创建一个可以写入任何日志记录框架的精简日志外观,此时备份引擎的选择变得非常有用。