java 生态下的日志框架

758 阅读6分钟

日志介绍

概念

在计算机领域,日志是用来记录了发生在运行中的操作系统或其他软件中的事件,或者记录了在网络聊天软件的用户之间发送的消息。

日志请求级别

我们常说的日志级别,一般指的是日志请求级别
比如说 .info() .error() 这里的 info 、 error 指的就是日志请求级别, 它表示 () 中的信息的“重要程度”

日志请求级别没有统一的规定,不同的日志门面框架日志实现框架定义的日志级别有些许差异。

例如
Log4j2 的8种日志请求级别 OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL (参考)

Log4j、Commons-Logging 的6种日志请求级别 FATAL、ERROR、WARN、INFO、DEBUG、TRACE

SLF4J 和 Logback 的5种日志请求级别 ERROR、WARN、INFO、DEBUG、TRACE(参考)

在这里建议尽量使用 ERROR、WARN、INFO、DEBUG 这种级别,因为它们在所有日志门面\实现框架中都通用

Java中常用日志框架

日志框架的演化

  • 1996 年初,欧洲安全电子市场 (EU SEMPER) 项目组决定编写它自己的程序跟踪 API(Tracing API)。经过不断的完善,这个 API 终于成为一个十分受欢迎的 Java 日志软件包,即 Log4j。后来 Log4j 成为 Apache 基金会项目中的一员。
  • Log4j 发布后近乎成了 Java 社区的日志标准。据说 Apache 基金会还曾经建议 sun 引入 Log4j 到 java 的标准库中,但 Sun 拒绝了。
  • 2002年 Java1.4 发布,Sun 推出了自己的日志库 JUL(Java Util Logging),其实现基本模仿了 Log4j 的实现。在 JUL 出来以前,log4j 就已经成为一项成熟的技术,使得 log4j 在选择上占据了一定的优势。
  • 2005年,Apache 推出了 JCL(Jakarta Commons Logging),JCL只是定义了一套日志接口(其内部也提供一个Simple Log的简单实现),支持运行时动态加载日志组件的实现,也就是说,在你应用代码里,只需调用 Commons Logging 的接口,底层实现可以是log4j,也可以是Java Util Logging。
  • 2006年,Ceki Gülcü (Log4j最初由他编写) 开发了 SLF4J(The Simple Logging Facade for Java) 作为 JCL(Jakarta Commons Logging) 的更可靠替代方案。之后又开发了 Logback 框架 (Slf4j 的实现),并回瑞典创建了 QOS 公司,QOS 官网上是这样描述 Logback 的:The Generic,Reliable Fast&Flexible Logging Framework(一个通用,可靠,快速且灵活的日志框架)。
  • 之后,Java 日志领域被划分为两大阵营:Commons Logging 阵营和 SLF4J 阵营。 Commons Logging 在 Apache 大树的笼罩下,有很大的用户基数。但有证据表明,形式正在发生变化。2013 年底有人分析了 GitHub 上30000个项目,统计出了最流行的100个 Libraries,可以看出 slf4j 的发展趋势更好
  • 2012-07 Apache 重写了 log4j 1.x,成立了新的项目 Log4j2。Log4j2 具有 Logback 的所有特性。

现在,SLF4J + Logback 是 Spring Boot 的默认日志框架

流行度可想而知

日志框架的分类

在上面的介绍种有提到了日志门面框架日志实现框架,那什么是日志门面框架日志实现框架

  • 日志门面框架指的是:无具体实现的抽象门面框架,如:Commons Logging、SLF4J
  • 日志实现框架:具体实现的框架,如:Log4j,Log4j2,Logback,Jul(java.util.logging)

日志门面框架

日志门面:是门面模式的一个典型的应用,门面模式,也称外观模式。日志门面框架就使一套提供了日志相关功能的接口而无具体实现的框架,其调用具体的实现框架来进行日志记录。也就是说日志门面天然的兼容日志实现框架。

在java 生态中国日志门面框架主要有两个 Commons Logging 和 SLF4J

日志门面框架的优点

日志门面框架是介于具体的日志框架与系统之间的桥梁,通过日志门面框架的应用,实现了系统与具体实现日志框架的解耦。无论具体实现的日志框架如何变化,都不会影响系统日志的记录功能,更无须更改系统代码,符合“开放-闭合原则”。

Commons Logging

Apache Commons Logging 原名 JCL(Jakarta Commons Logging) 是一个基于 Java 的日志门面框架。

SLF4J

SLF4J(Simple Logging Facade for Java),是一套包装 Logging 框架的界面程式,以外观模式实现。可以在软件部署的时候决定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及logback等框架。以MIT 授权方式发布。SLF4J 的作者就是 Log4j和Logback 的作者 Ceki Gülcü.

Commons Logging和SLF4J实现机制

Commons logging实现机制

Commons logging是通过动态查找机制,在程序运行时,使用自己的 ClassLoader 寻找和载入本地具体的实现。详细策略可以查看 commons-logging-*.jar 包中的 org.apache.commons.logging.impl.LogFactoryImpl.java 文件。由于 OSGi 不同的插件使用独立的 ClassLoader,OSGI 的这种机制保证了插件互相独立, 其机制限制了commons logging 在 OSGi 中的正常使用。

Slf4j实现机制

Slf4j 在编译期间,静态绑定本地的 LOG 库,因此可以在 OSGi 中正常使用。它是通过查找类路径下 org.slf4j.impl.StaticLoggerBinder,然后绑定工作都在这类里面进行。

日志实现框架

Log4j

最早的日志实现框架,早期由 Ceki Gülcü 开发,现在则是Apache软件基金会的一个项目。

JUL(Java Util Logging)

Java 1.4 以来的官方日志实现,主要参考自 Log4j

Logback

Log4j 的早期作者 Ceki Gülcü 开发的新一代日志框架

Log4j2

Apache Log4j2 是 Apache Log4j 的升级产品,并且不兼容 Log4j,主要参考自 Logback

框架选择

  • 成本考虑:Logback 的所有文档是全面免费提供,Apache Log4J 只提供部分免费文档,其余部分需要付费购买。
  • 资源开销:Commons Logging 相比较与 SLF4J 开销更高.
  • 性能:Logback 相比 Log4j、Log4j2 拥有更好的性能。Logback声称:某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在Logback中需要3纳秒,而在Log4J中则需要30纳秒。LogBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的。

在加上 Spring 选择 SLF4J + Logback 作为 Spring Boot 的默认日志框架

因此 SLF4J + Logback 成为了实际开发中的最佳选择

后记

Java 日志实现框架 Logback