天天看点

Java日志体系(一) 演变史、分类Java日志框架演变史日志分类

Java日志体系

  • Java日志框架演变史
    • Log4j
    • JUL(jdk-logging)
    • JCL(commons-logging)
    • Slf4j
    • Logback
    • Log4j2
  • 日志分类
    • 接口类 门面型日志框架
    • 实现类 记录型日志框架
    • 桥接类

Java日志框架演变史

Java日志体系(一) 演变史、分类Java日志框架演变史日志分类

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 来实现日志功能。

Java日志体系(一) 演变史、分类Java日志框架演变史日志分类

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

继续阅读