Java 中的日志记录是怎么回事?

为什么使用下列软件包中的一个而不是另一个?

  • Java Logging
  • 公共资源日志
  • 日志4j
  • SLF4j
  • 后退
12930 次浏览

按照 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 + ".");
}
  • 因为它比 log4j 更新,所以它支持参数化日志记录,因为它直接实现了 SLF4j
  • SLF4j/Logback,因为它是由写 log4j 的同一个人写的,所以他把它做得更好(根据 Ken G-谢谢。看到 他们之前的新闻时,似乎很合适)
  • 因为它们还发布了一个 log4j 适配器,所以您不必在旧代码中“切换”log4j-只需让 log4j.properties 使用 SLF4j 和它的配置

通常我会默认使用 Log4J。

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

I would use Commons Logging if I was enhancing something that already used it.

我建议创建一个可以写入任何日志框架的瘦日志 facade,此时选择支持引擎就变得毫无意义了。

In our company project we use LOG4j and it is very easy to use like Stephen showed in his example. 我们还为 LOG4j 编写了自己的模式类,以便您可以创建自己的输出文件模式。您可以描述日志文件的外观。可以增强原始的 log4j 类。

All LOG4j properties you can change in a log4j.properties file, so you can use different files for different projects.

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

参见对问题 记录错误的最佳实践是什么?的回答,特别是:

  • 有一些潜力 用 Commons 加载类的问题 记录

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

The 记录概述 gives the reason for its existence: logging from library code, when you have no control over the underlying logging framework. Very important for the various Apache projects, which will be linked into outside applications. Perhaps not so important for internal IT projects, where you have complete control.

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

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

我发现 Java 中的日志记录令人困惑、不一致、缺乏文档说明,尤其是随意性。此外,这些日志框架之间存在大量的相似性,导致工作重复,并且混淆了您实际所处的日志环境。特别是,如果您正在一个严肃的 Java web 应用程序堆栈中工作,那么您通常同时处于 多个日志记录环境中; (例如,hibernate 可能使用 log4j 和 tomcat Java.util.log)。Apachecommons 旨在连接不同的日志框架,但实际上只是增加了复杂性。如果你事先不知道这一点,那就完全令人困惑了。为什么我的日志消息没有打印到控制台等等?因为我看的是 Tomcat 的日志,不是 log4j。增加了另一层复杂性,应用服务器可能具有全局日志配置,这些配置可能无法识别特定 Web 应用程序的本地配置。最后,所有这些日志框架都太复杂了。Java 中的日志记录已经是一团乱麻,让像我这样的开发人员感到沮丧和困惑。

Early versions of Java did not have a built-in logging framework leading to this scenario.

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

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

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

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