问题

为什么人们会使用以下其中一个而不是另一个?

  • Java日志记录
  • Commons Logging
  • Log4j
  • SLF4j
  • 回归

#1 热门回答(85 赞)

按照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并配置它

#2 热门回答(33 赞)

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

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


#3 热门回答(22 赞)

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

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

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

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


原文链接