首先是System.out和System.err。 但是它们不灵活,因此就需要功能丰富的日志记录(请注意,当时我在上小学)。 可以定制格式记录的日志,可以记录到多个目标(文件,控制台,电子邮件等)。因此log4j出现在1999年 。
但是也产生了其他解决方案,包括java.util.logging –尝试使用标准JDK日志记录。 事实证明,这是一次非常成功的尝试。 java.util.logging于2002年初与JDK 1.4一起出现。几个月后,由于意识到所有现有记录器都需要一个通用日志记录接口,导致apache common-logging 。
Commons Logging的想法是可行的–库不应在使用它们的应用程序上强制执行特定的日志记录实现。 因此,每个日志记录实现都适应于库使用的通用API –因此您的库不使用org.apache.log4j.Logger –它使用org.apache.commons.logging.Log,并将其委托给任何日志记录框架存在于类路径上。 这样,您的项目可以使用多个库,并对所有库使用单个日志记录配置。
但是公共记录不足。 人们说它造成的问题多于解决的问题。 所以的log4j的作者- CekiGülcü SLF4J(简单记录门面为Java) -创建了一个新的项目在2005年 。 它旨在成为更好的公共记录。
Log4j自1999年以来已被广泛使用,但是它还不够好,所以请猜测谁创建了一个新项目– logback。 再次是CekiGülcü。 为什么要一个新项目? 好吧,我想是出于政治原因和需要从头开始替换的旧代码库的结合。 无论如何,logback出现在2006年。它比log4j好吗? 塞基在这里解释 。
所以回到今天-有很多日志记录框架和两个外观-commons-logging和slf4j。 每个库都使用不同的库,而且情况一团糟。 版本不匹配,类路径上有大量Logger类。 Maven通过至少不允许同一日志记录实现的多个版本而成功地简化了这一过程,仅此而已。 而且,如果您不了解上面的所有历史记录以及哪个框架用于什么,那么您的项目很可能会遭受这种混乱。
有什么解决方案? 最简单的方法是使用slf4j和logback。 为什么?
- slf4j具有许多现有实现的桥梁。 这意味着您将删除log4j.jar并使用log4j-over-slf4j.jar –它在同一软件包中具有相同的类,只是实现有所不同–它委托使用中的当前slf4j实现。 这样,所有使用log4j(或任何其他桥接实现)的库都将与您的logback配置一起使用。 不幸的是,这在java.util.logging中不能很好地工作,因此您必须希望不要有太多的库决定“最小的依赖范围”。
- logback优于log4j(相同作者-较新的实现,从以前的错误中学习)
- 如果出现了比登录更好的框架,则可以轻松切换到该框架而无需更改类。
最后,介绍一下日志记录配置。 它应该在外部,以与其他外部化项目配置相同的方式(最好在相同的位置)。 然后,您应该基于系统的“ config.location”属性加载它。
(在基于Spring的Web应用程序中,有Log4jWebConfigurer
,但没有LogbackWebConfigurer
。幸运的是,它很容易编写,并且有一些基于log4j的现有实现。在web.xml中, logbackConfigLocation
参数应该是: file://${config.lotation}/logback.xml
)
为什么这么简单的事情变得如此复杂? 因为这并不简单。 最初没有考虑太多因素,因此需要在以后进行纠正。 自2006年以来该领域未发生重大变化是一件好事,因此我们可以认为情况保持稳定。
参考: Bozho的技术博客上来自我们的JCG合作伙伴 Bozhidar Bozhanov的 The Logging Mess 。
相关文章 :
翻译自: https://www.javacodegeeks.com/2011/09/java-logging-mess.html