Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)

1、简介

JAVA日志在初期可能官方并无提供很好且实用的规范,致使各公司或OSS做者选择自行造轮子,这也致使了目前初学者以为市面上 Java 日志库繁杂的局面。html

如今市面流行以 slf4j(Simple Logging Facade for Java)作日志接口,基于门面模式的思想,开发者只需熟悉/使用 slf4j API 便可,而具体实现则是可更替的。java

以 slf4j 的概念,共可划分为如下4种库:apache

日志接口层 slf4j-api,common-logging
日志实现层 JUL(java.util.logging)
log4j
logback
slf4j-simple,slf4j-nop
绑定适配(adaptation)层 slf4j-jcl
slf4j-jdk14
slf4j-log412
桥接(bridge)层 jcl-over-slf4j
jul-to-slf4j
log4j-over-slf4j

2、日志框架各层说明

slf4j 几种流程示意图:Bridging legacy APIs
image设计模式

日志接口层

接口层的做用上面已经说了
以 SLF4J 为例,它并不是日志的实现(固然也没有实现的概念,由于没有标准),而是各类日志框架(java.util.logging,logbacak,log4j)的简单门面(facade,门面设计模式)或抽象接口,容许用户在部署时选择指望的日志框架实现。api

日志实现层

顾名思义,各类可用日志框架
需注意:与JDBC这种官方接口规范不一样,这些日志框架(如 log4j)并不必定实现自接口层 ,由于 slf4j接口 也只是第三方规范而已。
但有些日志框架自己就是接口层框架的实现,好比 logback 本地实现了 slf4j框架

绑定适配层

为了让非本地实现 slf4j 的框架(如 log4j)也能在 slf4j API 下工做,据 sfl4j 版本不一样有两种实现方式:ide

  1. (1.8 之前)静态绑定
  2. (1.8 之后)基于Java6 Java SPI (Service Provider Interface) 机制
    不管那种哪一种,都是须要引入这样一种适配器包来实现

桥接层

为了避免修改已有项目代码或想在项目中延用旧日志框架,同时又想让slf4j统一处理,可引入桥接包(如 log4j-over-slf4j.jar)替换原有的日志框架(log4j.jar),以此将日志重定向委托给 SLF4jpost

注意:桥接层与实现层不能为同一个日志框架,不然将形成无限循环,这也很容易理解。例如:jcl-over-slf4j.jarslf4j-jcl.jar 不能同时使用性能

3、各日志框架概述

如下仅简略概述,有个大概印象便可(该篇目不意在深刻某具体框架):设计

  1. Log4j
    Apache 的开源日志框架,名称含义 "Log for Java"

  2. JUL(java.util.logging)
    java.util.logging,由 JDK1.4 引入

  3. JCL(Jakarta Commons Logging)
    也叫 "Apache Commons Logging",也等同于常说的 common-logging,是为解决市面上不一样日志库而最先诞生的日志接口标准。

    JCL 只提供日志接口,具体实现则是在"运行时动态寻找",其内部也有个 Simple logger 简单实现但功能很弱,所以仍会看到不少程序使用 JCL + log4j 这种搭配。
    动态查找原理概述:

    • 首先,寻找 org.apache.commons.logging.LogFactory 的属性配置
    • 不然,则利用 SPI 机制
    • 不然,读取类路径下 commons-logging.properties 的配置
    • 不然,若存在 log4j,默认使用 log4j
    • 不然,使用 JDK1.4 Logger
    • 不然,使用内部的 SimpleLog

    但随着程序规模愈来愈庞大时,JCL动态绑定并不老是能成功,这也是 SLF4J 诞生缘由之一。

  4. SLF4J
    为改进 common-logging 而生的日志接口
    详见 SLF4J 快速入门 / 原理探究

  5. LogBack
    log4j 创始人设计的又一开源日志组件,通用、可靠、快速灵活 声称有极佳的性能。
    其一大特点是,其在 logback-classic 中本地(native)实现了 SLF4J API。
    当前分为三个模块:

    • logback-core:其余俩模块基础模块
    • logback-classic:日志模块,完整实现了 SLF4J API
    • logback-access:配合Servlet容器,提供 http 访问日志功能

4、延申

  1. slf4j 制定了日志标准固然有优势,但 slf4j 为何会成为标准,而非 jul 来指定标准(就像 JDBC 同样)?
    答:可参考此处提到的恩怨情仇 https://juejin.cn/post/6844904037641355271
  2. 一些jul相关包名上的 jdk14,指的是 JDK1.4(按如今版本规范来讲是 JAVA 4),而不是 JAVA 14
    能够查看 java.util.logging.LogManager 上的 @since 1.4 可知
  3. 一些包上的 nop 表示 no-operation,即无操做空实现。

参考:
- java日志组件介绍(jcl,jul,slf4j,logback很全,很透,看了一遍差很少就明白了
- 日志系列好文 https://www.cnblogs.com/xuningfans/p/12164734.html
- http://www.slf4j.org/

相关文章
相关标签/搜索