Java日志体系
- Java日志框架演变史
-
- Log4j
- JUL(jdk-logging)
- JCL(commons-logging)
- Slf4j
- Logback
- Log4j2
- 日志分类
-
- 接口类 门面型日志框架
- 实现类 记录型日志框架
- 桥接类
Java日志框架演变史
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zZiBHZYFWNk1mYwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4YTOwEDN1kTM2EzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
Log4j
Apache基金会最早实现的一套日志框架,在Java1.4之前只有这一种选择。谁能想到Java1.4之前,JDK都没有内置的日志功能!。
JUL(jdk-logging)
在2002年Java1.4发布,Sun推出了自己的日志库J.U.L(jdk-logging)。但基本上是模仿Log4j的实现。
JCL(commons-logging)
JUL 毕竟是 JDK 自带的,也有很多人用。同时还有其他日志组件,如 SimpleLog 等。这时如果有人想换成其他日志组件,如 log4j 换成 JUL,因为 API 完全不同,就需要改动代码。
为了将日志接口与实现解耦,Apache 推出了 JCL 即 Apache Commons Logging。JCL 只定义了一套日志接口,具体实现由 log4j 或 JUL 来完成。JCL 基于动态绑定来实现日志的记录,在使用时只需要用 JCL 定义的接口来编写代码即可,程序真正运行时会检查 classpath 中的具体实现,因此可以自由选择是由 log4j 还是 JUL 来实现日志功能。
Slf4j
2006年,Log4j的作者Ceki Gülcü离开Apache后,又搞出来一套类似J.C.L的接口类,就是Slf4j。原因是作者觉得J.C.L这套接口设计的不好,容易让开发者写出有性能问题的代码。Slf4j做为一套标准接口,可以实现无缝与多种实现框架进行对接。它也是现在比较常用的日志集成方式。
Logback
在搞出来Slf4j之后,Ceki Gülcü又顺带开发了Logback,做为Slf4j的默认实现。在功能完整度和性能上,Logback超越了所有已有的日志实现框架。
Logback是log4j的升级版,当前分为三个目标模块:
- logback-core:核心模块,是其它两个模块的基础模块
- logback-classic:是log4j的一个改良版本,同时完整实现 SLF4J API 使你可以很方便地更换成其它日记系统如log4j 或 JDK14 Logging
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日记的功能,是logback不可或缺的组成部分
Logback相较于log4j有更多的优点:
- 更快的执行速度
- 更充分的测试
- logback-classic 非常自然的实现了SLF4J
- 使用XML配置文件或者Groovy
- 自动重新载入配置文件
- 优雅地从I/O错误中恢复
- 自动清除旧的日志归档文件
- 自动压缩归档日志文件
- 谨慎模式
- Lilith
- 配置文件中的条件处理
- 更丰富的过滤
Log4j2
2012年,Apache重写了Log4j,实现了Log4j2。在功能上面具有Logback的所有特性。算是目前功能最完善的日志框架。
日志分类
接口类 门面型日志框架
只提供API定义,没有提供具体实现。目的是为应用层提供标准化的使用方式。既所谓的面向接口编程。SLF4J、JCL
实现类 记录型日志框架
具体的日志实现类,提供对日志的收集/管理功能。Log4j、JUL、Log4j2、Logback
桥接类
多种日志实现框架混用情况下,需要借助桥接类进行日志的转换,最后统一成一种进行输出。
slf4j-jdk14、slf4j-log4j12、log4j-slf4j-impl、logback-classic、slf4j-jcl、jul-to-slf4j、log4j-over-slf4j、icl-over-slf4j、log4j-to-slf4j