为什么一个将使用以下软件包之一而不是另一个?
- Java记录
- 共用记录
- Log4j
- SLF4j
- 退回
为什么一个将使用以下软件包之一而不是另一个?
Answers:
按照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应用程序堆栈中工作,则通常多一次记录环境;(例如,休眠可能使用log4j和tomcat java.util.logging)。Apache Commons旨在桥接不同的日志记录框架,但实际上只会增加更多的复杂性。如果您不提前知道这一点,那将非常令人困惑。为什么我的日志消息没有打印到控制台等?哦,因为我正在查看Tomcat日志,而不是log4j。增加了另一层复杂性,应用程序服务器可能具有全局日志记录配置,这些配置可能无法识别特定Web应用程序的本地配置。最后,所有这些日志记录框架都太复杂了。登录Java混乱无序,使像我这样的开发人员感到沮丧和困惑。
Java的早期版本没有导致这种情况的内置日志记录框架。
有一个之前没有提到的重要点:
SLF4J(以及Logback和LOG4J作为日志记录后端)都支持所谓的“映射诊断上下文”(MDC,请参阅javadoc和文档)。
本质上,这是线程本地的Map <String,String>,可用于将其他上下文信息添加到日志事件。MDC的当前状态附加到每个事件。
如果将诸如用户名和请求的URL之类的东西(如果是webapp)放入其中,这将非常有用。例如,可以使用过滤器自动完成此操作。
另请参阅以下问题的答案:记录错误的最佳实践是什么?,尤其是:
Commons Logging存在一些潜在的类加载问题。
Log4J和SLF4J由同一人开发,从Log4J实践中发现的问题中学习。
该共享日志记录概述给出了其存在的理由:从库中的代码记录,当你拥有了潜在的日志框架没有控制权。对于将链接到外部应用程序的各种Apache项目非常重要。对于您拥有完全控制权的内部IT项目,可能并不那么重要。
就是说,我写了Commons Logging,就像我认识的许多其他开发人员一样。原因是最大程度地减少了心理负担:您可以更改项目或职位,而不必学习新的框架(前提是新的职位/项目也使用CL,并且/或者您可以说服他们继续使用)。
同样,围绕使用的任何框架创建自己的包装器也有一些价值。如上所述这里,我喜欢用LogWrapper目的是提供自定义的字串(重要),并最大限度地减少日志报表(不那么重要)的视觉混乱。
通常,我会默认使用Log4J。
如果我不介意对Java 1.4的依赖,我将使用Java Logging,但是我仍然会优先使用Log4J。
如果要增强已经使用的功能,我将使用Commons Logging。
我建议创建一个可以写入任何日志记录框架的瘦日志记录外观,这时选择支持引擎几乎是一个有争议的话题。