为什么要使用以下软件包之一而不是另一个?
- Java 日志记录
- 公共记录
- 日志4j
- SLF4j
- 回溯
按 api 出现的时间顺序(据我所知):
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 + ".");
}
我发现 Java 中的日志记录令人困惑、不一致、记录不充分,而且特别随意。此外,这些日志框架之间存在大量相似性,导致重复工作,并且对您实际所处的日志环境感到困惑。特别是,如果您在一个严肃的 Java Web 应用程序堆栈中工作,您通常会处于多一次记录环境;(例如hibernate 可以使用log4j 和tomcat java.util.logging)。Apache commons 旨在连接不同的日志框架,但实际上只是增加了更多的复杂性。如果你不提前知道这一点,那是完全令人困惑的。为什么我的日志消息没有打印到控制台等?哦,因为我正在查看 Tomcat 日志,而不是 log4j。再增加一层复杂性,应用程序服务器可能具有可能无法识别特定 Web 应用程序的本地配置的全局日志记录配置。最后,所有这些日志框架都太复杂了。用 Java 登录一直是一团混乱,让像我这样的开发人员感到沮丧和困惑。
Java 的早期版本没有导致这种情况的内置日志框架。
另请参阅问题的答案记录错误的最佳做法是什么?, 尤其:
Commons Logging 存在一些潜在的类加载问题。
Log4J 和 SLF4J 是由同一个人开发的,从 Log4J 实践中发现的问题中学习。
在我们公司的项目中,我们使用 LOG4j,它非常易于使用,就像 Stephen 在他的示例中展示的那样。我们还为 LOG4j 编写了自己的模式类,因此您可以创建自己的输出文件模式。您可以描述您的日志文件的外观。可以增强原始 log4j 类。
您可以在 log4j.properties 文件中更改所有 LOG4j 属性,因此您可以为不同的项目使用不同的文件。
Java 日志记录不是我最喜欢的,但这可能是因为我从一开始就使用 log4j。
Commons Logging 概述给出了它存在的原因:当您无法控制底层日志记录框架时,从库代码进行日志记录。对于将链接到外部应用程序的各种 Apache 项目非常重要。也许对于您可以完全控制的内部 IT 项目来说并不那么重要。
也就是说,我写信给 Commons Logging,我认识的许多其他开发人员也是如此。原因是为了尽量减少心理负担:您可以更改项目或工作,而不必学习新框架(假设新工作/项目也使用 CL,和/或您可以说服他们转向它)。
此外,围绕您使用的任何框架创建自己的包装器都有一些价值。如此处所述,我喜欢使用 LogWrapper 对象来提供自定义字符串化(重要),并尽量减少日志语句的视觉混乱(不太重要)。
通常我会默认使用 Log4J。
如果我不介意对 Java 1.4 的依赖,我会使用 Java Logging,但我仍然会优先使用 Log4J。
如果我要增强已经使用过的东西,我会使用 Commons Logging。
我建议创建一个可以写入任何日志框架的精简日志外观,此时支持引擎的选择几乎成为一个有争议的问题。