为什么要使用以下其中一个包而不是另一个呢?
答案 0 :(得分:86)
按照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 + ".");
}
答案 1 :(得分:35)
我发现Java中的日志记录令人困惑,不一致,文档记录不清,特别是杂乱无章。此外,这些日志记录框架之间存在巨大的相似性,导致重复工作,以及您实际所处的日志环境的混淆。特别是,如果您在一个严肃的Java Web应用程序堆栈中工作,那么您经常在一次多个日志记录环境; (例如hibernate可能使用log4j和tomcat java.util.logging)。 Apache commons旨在桥接不同的日志框架,但实际上只是增加了复杂性。如果你不提前知道这一点,那就太令人困惑了。为什么我的日志消息没有打印到控制台等?哦,因为我正在查看Tomcat日志,而不是log4j。添加另一层复杂性,应用程序服务器可能具有全局日志记录配置,这些配置可能无法识别特定Web应用程序的本地配置。最后,所有这些日志记录框架都很复杂。登录Java一直是一个杂乱无章的混乱,让像我这样的开发人员感到沮丧和困惑。
早期版本的Java没有内置的日志框架导致这种情况。
答案 2 :(得分:22)
以前没有提到过一个重点:
SLF4J(Logback和LOG4J都作为日志记录后端)支持所谓的映射诊断上下文(MDC,请参阅javadoc和documentation)。
这实际上是一个线程局部的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)
我建议创建一个可以写入任何日志记录框架的精简日志外观,此时备份引擎的选择变得非常有用。