日志门面技术(3):JCL(Jakarta Commons Logging)
目录
背景
▎ JCL的诞生
JCL 是什么?
▎快速入门案例
JCL原理
✈ 源码断点查看执行流程
JCL日志门面总结
☁ 每日一题:为什么要学习日志门面JCL?
日志框架出现的历史顺序:Log4j → JUL → JCL → slf4j → logback → log4j2
背景
在前面博文中,我们分别讲述了常用的2个日志框架:JUL(Java Util Logging)、Log4J。那么如何选择使用哪一个呢?
根据项目需求而定,在项目设计之初,功能比较单一简单,那么我们可以使用JUL日志框架,使用起来非常灵活,也不需要引入第三方依赖,随着我们项目升级,迭代维护,功能会越来越完善,简单的日志实现框架就不能满足我们的业务需求,那么就要进行日志升级!
如果我们从JUL日志实现框架切换为Log4j的话,代码会受到冲突影响,虽然Log4j在1.2以后,为了迎合JUL的设计思想,也把自己代码改成logger了,但它的日志级别和配置信息还是有一定的差异化,如果我们的日志代码有一万行,那么都要进行修改,这无疑是增加了很多工作量
▎ JCL的诞生
为了解决这个问题,apache组织就站出来了,它就将当时比较主流的日志实现框架,例如 JUL、Log4j 将代码统一成一套API,后期软件开发阶段,只需要关联这套统一的API,就可以操作某一个日志实现框架的日志记录了,代码无需发生改变。
以面向接口的方式,来操作具体的实现。一种解耦合的思想,这个技术就是:JCL
比如web应用需要进行日志记录的话,不再直接依赖log4j、jdk14等日志实现了,而是依赖JCL这套统一的接口API,它会帮助我们调用具体的日志实现:
JCL 是什么?
JCL 全称为Jakarta Commons Logging,是Apache提供的一个通用日志API。
它是为 “所有的Java日志实现” 提供一个统一的接口,它自身也提供一个日志的实现,但是功能非常弱(SimpleLog)。所以一般不会单独使用它,它允许开发人员使用不同的具体日志实现工具:Log4j,JDK自带的日志(JUL)
JCL 有两个基本的抽象类:Log(基本记录器)和 LogFactory(负责创建Log实例)
▎快速入门案例
注:建立一个普通的maven项目即可
1. 引入maven依赖(为了方便测试,同步也引入junit)
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>compile</scope></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
</dependencies>
2. 编写测试用例
// 注意:jcl日志框架引入的是org.apache.commons.logging包类
public class Demo {// 入门案例@Testpublic void testQuick(){// 1.通过LogFactory获取日志记录器Log log = LogFactory.getLog(Demo.class);// 2.打印日志信息log.info("hello JCL");}
}
3. 运行测试用例
➳ 说明:LogFactory 负责创建具体log实例,底层调用Log4j 或 JUL(Java util logging) ,具体调用哪个取决于引入了哪个组件,上述例子没有引入Log4j依赖,因此它底层用的是JUL日志框架。
✈ 引入Log4j依赖
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version>
</dependency>
1. 执行测试用例
⚠️ warn警告:找不到logger对象的appenders处理器,它希望我们设置并初始化一个系统配置信息
我们在《日志框架:Log4j》博文中详细讲述过了,这里不再详解,直接把博文中的log4.properties配置文件复制过来,放入当前资源目录下:
2. log4j.properties配置文件具体代码
# 设置rootLogger的日志级别为trace,appender处理器类型为ConsoleAppender
log4j.rootLogger = trace,consoleAppender# ---------------------------设置ConsoleAppender-------------------------
# "log4j.appender." 是前缀规范设置参数,myAppender是我们自己定义的appender的名称
# 设置appender类型为ConsoleAppender:将日志输出到控制台
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender# 设置名为myAppender的appender处理器的layout日志格式化类型
log4j.appender.consoleAppender.layout = org.apache.log4j.SimpleLayout
3. 继续运行测试用例:成功输出日志信息
JCL原理
其内部主要通过LogFactory 日志工厂去加载具体的日志实现
1. 通过LogFactory动态加载Log实现类
➳ 说明:Log类是一个接口,其实现它有4个日志框架
- SimpleLog:JCL的内置日志实现
- Log4JLogger:log4j 日志框架
- Jdk14Logger:JUL(Java Util Logging)
- Jdk13LumberjackLogger:Jdk老版本的内置日志实现
2. 日志门面支持的日志实现数组
public class LogFactoryImpl extends LogFactory {.....private static final String[] classesToDiscover = new String[]. {"org.apache.commons.logging.impl.Log4JLogger", "org.apache.commons.logging.impl.Jdk14Logger", "org.apache.commons.logging.impl.Jdk13LumberjackLogger", "org.apache.commons.logging.impl.SimpleLog"};.....}
➳ 说明:日志工厂其内部有一个加载日志的数组,加载顺序是按照数组顺序来的,这也解释了为什么入门案例中引入了Log4J,JCL内部日志框架就从JUL切换至Log4J了
3. 具体实现代码
for(int i = 0; i < classesToDiscover.length && result == null; ++i) {result = this.createLogFromClass(classesToDiscover[i], logCategory, true);
}
➳ 说明:通过日志数组顺序加载日志框架,如果没有找到,则继续加载下一个,否则直接返回。
✈ 源码断点查看执行流程
1. 测试类中断点debug模式进入
2. 进入到内部实现,首先初始化的是一个日志工厂 getFactory()
2. 我们暂时不关心它的实现,因此直接跳出 getFactory()
3. 继续点击进入 ,会进入到getInstance(clazz) 方法内部
4. getInstance(clazz)方法如下,其实际进行了一次封装,因此进入到内部实际初始化代码中
5. 对象初始化代码实现如下,进入点击进入到 discoverLogImplementation 方法
6. discoverLogImplementation 方法才是最终加载具体日志框架的实现,for循环加载日志数组,第一个是log4j,如果加载成功,则直接返回,否则按照顺序往下遍历加载
7. for 循环加载方法 this.createLogFromClass(),其内部实现是通过反射进行记载日志框架的
8. 由于我们增加了log4j依赖,因此直接可以拿到log4j的类名,进行反射获取到,最后直接返回
- SimpleLog:JCL的内置日志实现
- Log4JLogger:log4j 日志框架
- Jdk14Logger:JUL(Java Util Logging)
- Jdk13LumberjackLogger:Jdk老版本的内置日志实现
JCL日志门面总结
从原理中我们知道,JCL是通过一个日志数组顺序加载,日志数组中包含:JCL的内置日志实现SimpleLog、log4j 、JUL(Java Util Logging)以及Jdk老版本的内置日志实现。
✷ 设计缺陷:如果后期又出现了新的日志实现主流框架,如果你想加载的话,就需要修改JCL源代码,实现Log接口,放入到日志加载数组中,因此JCl已经在2014年被apache淘汰了
☁ 每日一题:为什么要学习日志门面JCL?
- 面向接口开发,不再依赖具体的实现类,减少代码的耦合
- 项目通过导入不同的日志实现类,可以灵活的切换日志框架
- 统一API,方便开发者学习和使用
- 统一配置便于项目日志的管理
日志门面技术(3):JCL(Jakarta Commons Logging)相关推荐
- Jakarta Commons Logging(JCL)开发手记
JCL(Jakarta Commons Logging)和log4j不都是做log的吗,怎么在jcl的源码包中,还有个log4j的包?倒底怎么回事?看了jcl的用户指南,就明白了. 1.Common ...
- Java日志门面技术 JCL
文章目录 背景 JCL的诞生 JCL是什么? 快速入门 JCL原理 设计缺陷 背景 在前面博文中,我们分别讲述了常用的2个日志框架:JUL(Java Util Logging).Log4J.那么如何选 ...
- Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)
1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...
- Jakarta Commons Logging学习笔记
1.Commons-Loggin简介 Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具. 它提 ...
- Java日志门面技术 SLF4J
文章目录 背景 SLF4J概述 切换日志框架 实际应用 配合自身简单日志实现(slf4j-simple) 配置logback日志实现 配置Log4J日志实现(需适配器) 配置JUL日志实现(需适配器) ...
- 【log4j】—日志记录log4j的Logger和commons.logging的Log的区别
1.做日志的时候一般是两者一起用,commons-logging工作原理做接口,log4j做实现,应用起来比单独的使用log4j要简单. commons-logging工作原理: 1.1 首先在cla ...
- Java日志门面- JCL和 常用日志门面SLFJ详解
使用日志门面的原因 目前经常用的日志框架技术有:JUL.Log4j.log4j2.logback用来记录日志信息 ,之前我们讲过,我们学习不同的日志框架.他们的API是不同的,这样难以进行有效的记忆, ...
- 03、JCL(日志门面)
文章目录 前言 一.认识JCL 1.1.JCL概述 1.2.第三方jar包 1.3.认识Log接口与LogFactory抽象类 二.JCL实际使用 2.1.应用JUL(jdk自带日志) 2.2.应用L ...
- 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)
文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...
最新文章
- 路由网关--spring cloud zuul
- iOS开发-关于自定义控件很值得一看的文章(一)
- 华为服务器故障灯不开机_总有故障灯亮却不知道是怎么回事?详解这些你不认识的故障灯...
- 此心拖泥带水,是人生最苦处
- NYOJ 541 最强的战斗力
- 退出python交互模式_python如何退出交互模式
- VTK:图片之ImageMapToColors
- nssl1149,jzoj5455-拆网线【贪心】
- gcc是java的什么意思_为什么gcc支持Java而不是C#
- 纯CSS实现移动端常见布局——高度和宽度挂钩的秘密
- 【c++leetcode】判断一个数是否是2的幂、3的幂、4的幂
- Kinect v2 使用ork功能包进行物体识别
- Redis 6.0学习指南
- 安装fitz报错_Kylo单机安装详解
- Jenkins Pipeline声明式流水线
- Al-learing数学基础,平均差,方差,协方差
- Alexnet网络模型在cifar-10数据集上的实现(基于tensorflow-gpu)
- 三极管类型及工作状态判断
- 如何在HTML中引用jQuery函数库
- C++入门——仿真小球自由落体运动和抛物线运动
热门文章
- fatal error: error closing /tmp/ccsdc7Zt.s: No space left on device
- 51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)
- css的中文名称是,CSS 中文字体的英文名称
- 易编远航第三期第3套 穿越火线CF辅助开发实战
- android手机连接PC无法正常安装驱动
- win7旗舰版64位降32位的方法步骤
- IC 封装名词解释(一)
- illustrator下载_如何在Illustrator中创建光泽的圣诞摆设
- 设置允许从网络访问计算机的用户账户(加入guest组),多机组网问题 如何设置局域网文件共享(2)...
- LabVIEW读取电子表格的例子