最早的日志组件是Apache基金会提供的Log4j,log4j能够通过配置文件轻松的实现日志系统的管理和多样化配置,所以很快被广泛运用。也是我们接触得比较早和比较多的日志组件。它几乎成了Java社区的日志标准。
据说Apache基金会还曾经建议Sun引入Log4j到java的标准库中,但Sun拒绝了。 所以sun公司在java1.4版本中,增加了日志库(Java Util Logging)。其实现基本模仿了Log4j的实现。在JUL出来以前,Log4j就已经成为一项成熟的技术,使得Log4j在选择上占据了一定的优势
Apache推出的JUL后,有一些项目使用JUL,也有一些项目使用log4j,这样就造成了开发者的混乱,因为这两个日志组件没有关联,所以要想实现统一管理或者替换就非常困难。怎么办呢?
这个状况交给你来想想办法,你该如何解决呢?进行抽象,抽象出一个接口层,对每个日志实现都适配,这样这些提供给别人的库都直接使用抽象层即可这个时候又轮到Apache出手了,它推出了一个Apache Commons Logging组件,JCL只是定义了一套日志接口(其内部也提供一个Simple Log的简单实现),支持运行时动态加载日志组件的实现,也就是说,在你应用代码里,只需调用Commons Logging的接口,底层实现可以是Log4j,也可以是Java Util Logging
由于它很出色的完成了主流日志的兼容,所以基本上在后面很长一段时间,是无敌的存在。连spring也都是依赖JCL进行日志管理
但是故事并没有结束原Log4J的作者,它觉得Apache Commons Logging不够优秀,所以他想搞一套更优雅的方案,于是slf4j日志体系诞生了,slf4j实际上就是一个日志门面接口,它的作用类似于Commons Loggins。 并且他还为slf4j提供了一个日志的实现-logback。
因此大家可以发现Java的日志领域被划分为两个大营:Commons Logging 和 slf4j
另外,还有一个log4j2是怎么回事呢? 因为slf4j以及它的实现logback出来以后,很快就赶超了原本apache的log4j体系,所以apache在2012年重写了log4j, 成立了新的项目Log4j2
总的来说,日志的整个体系分为日志框架和日志系统
日志框架:JCL/ Slf4j
日志系统:Log4j、Log4j2、Logback、JUL。
而在我们现在的应用中,绝大部分都是使用slf4j作为门面,然后搭配logback或者log4j2日志系统