Java日志门面技术 JCL
文章目录
- 背景
- JCL的诞生
- JCL是什么?
- 快速入门
- JCL原理
- 设计缺陷
背景
在前面博文中,我们分别讲述了常用的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。
JCL 有两个基本的抽象类:Log(基本记录器)和 LogFactory(负责创建Log实例)
快速入门
新建一个maven项目引入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>
编写测试用例
// 注意:jcl日志框架引入的是org.apache.commons.logging包类
public class Demo {// 入门案例@Testpublic void testQuick(){// 1.通过LogFactory获取日志记录器Log log = LogFactory.getLog(Demo.class);// 2.打印日志信息log.info("hello JCL");}
}
LogFactory 负责创建具体log实例,底层调用Log4j 或 JUL(Java util logging) ,具体调用哪个取决于引入了哪个组件,上述例子没有引入Log4j依赖,因此它底层用的是JUL日志框架。
引入Log4j依赖
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.13</version>
</dependency>
再次运行
⚠️ warn警告: 找不到logger对象的appenders处理器,它希望我们设置并初始化一个系统配置信息
# 设置rootLogger的日志级别为trace,appender处理器类型为ConsoleAppender
log4j.rootLogger = trace,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
再次运行成功
JCL原理
其内部主要通过LogFactory 日志工厂去加载具体的日志实现
通过LogFactory动态加载Log实现类
日志门面支持的日志实现数组
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了。
具体实现代码
for(int i = 0; i < classesToDiscover.length && result == null; ++i) {result = this.createLogFromClass(classesToDiscover[i], logCategory, true);
}
总结
JCL是通过一个日志数组顺序加载,日志数组中包含:JCL的内置日志实现SimpleLog、log4j JUL(Java Util Logging)以及Jdk老版本的内置日志实现。
设计缺陷
如果后期又出现了新的日志实现主流框架,如果你想加载的话,就需要修改JCL源代码,实现Log接口,放入到日志加载数组中,因此JCl已经在2014年被apache淘汰了。
原文链接:https://blog.csdn.net/w15558056319/article/details/123793600
Java日志门面技术 JCL相关推荐
- Java日志门面技术 SLF4J
文章目录 背景 SLF4J概述 切换日志框架 实际应用 配合自身简单日志实现(slf4j-simple) 配置logback日志实现 配置Log4J日志实现(需适配器) 配置JUL日志实现(需适配器) ...
- Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)
1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...
- Java日志门面- JCL和 常用日志门面SLFJ详解
使用日志门面的原因 目前经常用的日志框架技术有:JUL.Log4j.log4j2.logback用来记录日志信息 ,之前我们讲过,我们学习不同的日志框架.他们的API是不同的,这样难以进行有效的记忆, ...
- 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)
文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...
- java日志框架之JCL和SLF4J
文章目录 1.JCL 1.1.JCL简介 1.2.入门使用 2.SLF4J 2.1.日志门面概述 2.2.SLF4J简介 2.3.入门使用 2.4.slf4j实现slf4j-simple和logbac ...
- 日志框架(3) : 日志门面、JCL介绍、SLF4J介绍
文章目录 日志门面 日志门面概述 门面模式(外观模式) 日志门面 常见的日志框架及日志门面 JCL简介 SLF4J SLF4J简介 SLF4J桥接技术 SLF4J特点 SLF4J集成日志实现(jul, ...
- 日志门面技术(3):JCL(Jakarta Commons Logging)
目录 背景 ▎ JCL的诞生 JCL 是什么? ▎快速入门案例 JCL原理 ✈ 源码断点查看执行流程 JCL日志门面总结 ☁ 每日一题:为什么要学习日志门面JCL? 日志框架出现的历史顺序:Log4j ...
- Java日志框架 -- JCL日志门面(JCL概念介绍、JCL示例)
1. JCL 全称为Jakarta Commons Logging,是Apache提供的一个通用日志API.是日志门面的一种实现方式,另外一种日志门面的实现方式是Slf4j. 它是为 "所有 ...
- Java日志系统03 ---- JCL门面日志
目录标题 前言 简介 使用 Maven依赖 测试代码 切换Log4j日志 前言 当前文章只是学习笔记,具体请点击超链接:视频 简介 全称为Jakarta Commons Logging,是Apache ...
最新文章
- spring-aop入门
- C++编译器Qt Creator下载地址
- matlab“机器学习和深度学习”系列工具箱作用总结
- php大数组循环嵌套的性能优化
- 怎样安全的使用可变参数宏__VA_ARGS__
- 从Boxee的Amie Street访问音乐
- strcpy函数_错误更正(拷贝赋值函数的正确使用姿势)
- 解读设计模式----策略模式(Strategy Pattern)
- C++新特性探究(五):for循环、范围for语句
- 整数的二进制表示中 1 的个数
- linux 设置固定网络转发_关于 Linux 网络,你必须知道这些
- 解决QQ聊天自动转成表情
- 基于SpringBoot的社团管理系统的设计与实现
- 研究人性弱点的黑客?聊聊社会工程学与网络安全
- php CI框架单元测试
- MySQL的 初步认识 - 细节狂魔
- Unknown host 'dl.google.com'. You may need to adjust the proxy settings in Gradle.
- Oracle配置本地网络服务器测试不成功,无监听程序
- “嗲”上海文化,女人需要学会的4种气质
- 酒吧类型与其娱乐项目设置
热门文章
- 计算机网络本科形成性考核册6,2016年秋电大 中央电大计算机网络本科形成性考核册答案.doc...
- linux服务安全与监控二
- android icloud云盘,icloud备份恢复到安卓手机(全方面了解iCloud轻松玩转iCloud)
- mysql建图书馆表_数据库图书管理建表与修改表
- 封装微信小程序提现到零钱
- C Primer Plus 第六版 章节课后编程练习答案(下)(缘更)
- SQLserve数据库存储过程
- 尝试一下: 仅加密已用磁盘空间
- UVA475 KMP算法题
- mysql使用教程图文_MySQL使用教程图文详解