Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)
一、简介
JAVA日志在初期可能官方并没有提供很好且实用的规范,导致各公司或OSS作者选择自行造轮子,这也导致了目前初学者觉得市面上 Java 日志库繁杂的局面。
现在市面流行以 slf4j(Simple Logging Facade for Java)做日志接口,基于门面模式的思想,开发者只需熟悉/使用 slf4j API 即可,而具体实现则是可更替的。
以 slf4j 的概念,共可划分为以下4种库:
| 日志接口层 | 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 |
二、日志框架各层说明
slf4j 几种流程示意图:Bridging legacy APIs

日志接口层
接口层的作用上面已经说了
以 SLF4J 为例,它并非日志的实现(当然也没有实现的概念,因为没有标准),而是各种日志框架(java.util.logging,logbacak,log4j)的简单门面(facade,门面设计模式)或抽象接口,允许用户在部署时选择期望的日志框架实现。
日志实现层
顾名思义,各种可用日志框架
需注意:与JDBC这种官方接口规范不同,这些日志框架(如 log4j)并不一定实现自接口层 ,因为 slf4j接口 也只是第三方规范而已。
但有些日志框架本身就是接口层框架的实现,比如 logback 本地实现了 slf4j
绑定适配层
为了让非本地实现 slf4j 的框架(如 log4j)也能在 slf4j API 下工作,据 sfl4j 版本不同有两种实现方式:
- (1.8 以前)静态绑定
- (1.8 以后)基于Java6 Java SPI (Service Provider Interface) 机制
无论那种哪种,都是需要引入这样一种适配器包来实现
桥接层
为了不修改已有项目代码或想在项目中延用旧日志框架,同时又想让slf4j统一处理,可引入桥接包(如 log4j-over-slf4j.jar)替换原有的日志框架(log4j.jar),以此将日志重定向委托给 SLF4j
注意:桥接层与实现层不能为同一个日志框架,否则将造成无限循环,这也很容易理解。例如:jcl-over-slf4j.jar 与 slf4j-jcl.jar 不能同时使用
三、各日志框架概述
以下仅简略概述,有个大概印象即可(该篇目不意在深入某具体框架):
Log4j
Apache 的开源日志框架,名称含义 "Log for Java"JUL(java.util.logging)
java.util.logging,由 JDK1.4 引入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 诞生原因之一。
SLF4J
为改进 common-logging 而生的日志接口
详见 SLF4J 快速入门 / 原理探究LogBack
log4j 创始人设计的又一开源日志组件,通用、可靠、快速灵活 声称有极佳的性能。
其一大特色是,其在 logback-classic 中本地(native)实现了 SLF4J API。
当前分为三个模块:- logback-core:其他俩模块基础模块
- logback-classic:日志模块,完整实现了 SLF4J API
- logback-access:配合Servlet容器,提供 http 访问日志功能
四、延申
- slf4j 制定了日志标准当然有优点,但 slf4j 为什么会成为标准,而非 jul 来指定标准(就像 JDBC 一样)?
答:可参考此处提到的恩怨情仇 https://juejin.cn/post/6844904037641355271 - 一些jul相关包名上的 jdk14,指的是 JDK1.4(按现在版本规范来说是 JAVA 4),而不是 JAVA 14
可以查看java.util.logging.LogManager上的@since 1.4可知 - 一些包上的
nop表示 no-operation,即无操作空实现。
参考:
- java日志组件介绍(jcl,jul,slf4j,logback很全,很透,看了一遍差不多就明白了
- 日志系列好文 https://www.cnblogs.com/xuningfans/p/12164734.html
- http://www.slf4j.org/
Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)的更多相关文章
- Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明
Log4j Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等 ...
- JAVA日志框架概述
日志用来记录应用的运行状态以及一些关键业务信息,其重要性不言而喻,通常我们借助于现有的日志框架完成日志输出.目前开源的日志框架很多,常见的有log4j.logback等,有时候我们还会 ...
- Java日志框架:slf4j作用及其实现原理
简单回顾门面模式 slf4j是门面模式的典型应用,因此在讲slf4j前,我们先简单回顾一下门面模式, 门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用.用一 ...
- Java日志框架SLF4J和log4j以及logback的联系和区别
1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...
- 拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系
log4j 以及 logback, slf4j 官网 日志框架的困惑 作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题. 但是,我们经常在项目的依赖中,见到奇奇怪 ...
- java日志框架slf4j与log4j
日志记录自然是非常重要的,但恐怕能记住slf4j与log4j等日志框架配置的人就很少了,这个东西不难,只是配置好后很少会去动它,开发新项目一般也是从其他项目拷贝,或者参照文档 废话不多说,先说log4 ...
- 3.Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback大总结
一.slf4j.jcl.jul.log4j1.log4j2.logback JUL:JDK中的日志记录工具,也常称为JDKLog.jdk-logging. LOG4J1:一个具体的日志实现框架. LO ...
- java日志框架log4j详细配置及与slf4j联合使用教程
最后更新于2017年02月09日 一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” <d ...
- Java日志框架Slf4j+Log4j入门
一.日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的日志 ...
随机推荐
- Go语言中slice作为参数传递时遇到的一些“坑”
前言 相信看到这个题目,可能大家都觉得是一个老生常谈的月经topic了.一直以来其实把握一个"值传递"基本上就能理解各种情况了,不过最近遇到了更深一点的"小坑" ...
- excel用函数去掉单元格内容中的括号,并只保留单元格里面的内容
1.substitute(需要执行替换操作的单元格,需要替换的字符,替换后的字符,有多个需要替换的字符可以指定替换的第几个) 例如:aab--substitute("aab",&q ...
- lms微服务的rpc通信框架
RPC的概念 RPC 全称 Remote Procedure Call--远程过程调用.是为了解决远程调用服务的一种技术,使得调用者像调用本地服务一样方便透明.简单的说,RPC就是从一台机器(客户端) ...
- 详解 MD5 信息摘要算法
对于软件研发人员来说 MD5 不是一个陌生的词汇,平时的软件研发中,经常使用 MD5 校验消息是否被篡改.验证文件完整性,甚至将MD5当作加密算法使用. MD5虽不陌生,但不是所有研发人员都了解其算法 ...
- Java:java获取Linux下的路径
指定Linux的路径 //Linux系统路径 StringBuilder sb = new StringBuilder(File.separator); String Url = sb.append( ...
- 删除表的语句(drop truncate delete)
p.p1 { margin: 0; font: 12px ".PingFang SC" } p.p2 { margin: 0; font: 12px "Helvetica ...
- Java实验项目三——面向对象定义职工类和日期类
Program:按照如下要求设计类: (1)设计一个日期类,用于记录年.月.日,并提供对日期处理的常用方法. (2)设计一个职工类,该职工类至少具有下面的属性:职工号,姓名,性别,生日,工作部门,参加 ...
- linux学习之路第八天(组管理和权限管理)
组管理和权限管理 1.Linux 组基本介绍 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者,所在组,其他组的概念 1)所有者 2)所在组 3)其它组 4)改变 ...
- linux学习之路第九天(磁盘分区,挂载详解)
磁盘分区,挂载 -----分区基础知识 分区的方式 1)mbr分区: 1.最多支持四个主分区 2.系统只能安装在主分区 3.扩展分区要占一个主分区 4.mbr最大只支持2TB,但拥有最好的兼容性 -- ...
- 『心善渊』Selenium3.0基础 — 23、Selenium元素等待
目录 1.什么是元素等待 2.为什么要设置元素等待 3.Selenium中常用的等待方式 4.强制等待 5.隐式等待 (1)隐式等待介绍 (2)示例 6.显式等待 (1)显式等待介绍 (2)语法 (3 ...