java中jcl,spring-jcl 日志源码分析
1、spring-jcl介绍
JCL全称:Jakarta Commons Logging
spring-jcl 采用了设计模式中的“适配器模式”,它对外提供统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架。
spring 5.1.3版本中支持 LOG4J(2.X及其以上版本) , SLF4J_LAL, SLF4J, JUL
final class LogAdapter {
…
private enum LogApi {
LOG4J, SLF4J_LAL, SLF4J, JUL
}
…
}
2、使用方式:
1、加入具体的日志实现类:LOG4J, SLF4J_LAL, SLF4J, JUL
2、针对某个日志系统加入配置例如:log4j2.xml
3、调用统一api创建日志对象
Log log = LogFactory.getLog(HashMapTest.class);
log.info(map);
3、源码分析
1、LogFactory调用静态方法 getLog,通过适配器LogAdapter返回具体的LOGS对象
public abstract class LogFactory {
…
public static Log getLog(String name) {
return LogAdapter.createLog(name);
}
…
}
2、LogAdapter 静态代码块的方式,根据classpath下具体的日志系统jar包,识别当前系统的日志实现方式,默认使用JUL
private static LogApi logApi = LogApi.JUL;
static {
ClassLoader cl = LogAdapter.class.getClassLoader();
try {
// Try Log4j 2.x API
Class.forName(“org.apache.logging.log4j.spi.ExtendedLogger”, false, cl);
logApi = LogApi.LOG4J;
}
catch (ClassNotFoundException ex1) {
try {
// Try SLF4J 1.7 SPI
Class.forName(“org.slf4j.spi.LocationAwareLogger”, false, cl);
logApi = LogApi.SLF4J_LAL;
}
catch (ClassNotFoundException ex2) {
try {
// Try SLF4J 1.7 API
Class.forName(“org.slf4j.Logger”, false, cl);
logApi = LogApi.SLF4J;
}
catch (ClassNotFoundException ex3) {
// Keep java.util.logging as default
}
}
}
}
3、 LogAdapter.createLog(name); 使用 switch case 方式根据上一步的判断,调用具体的日志适配器,创建具体Log对象,此处以LOG4J为例。
public static Log createLog(String name) {
switch (logApi) {
case LOG4J:
return Log4jAdapter.createLog(name);
case SLF4J_LAL:
return Slf4jAdapter.createLocationAwareLog(name);
case SLF4J:
return Slf4jAdapter.createLog(name);
default:
return JavaUtilAdapter.createLog(name);
}
}
private static class Log4jAdapter {
public static Log createLog(String name) {
return new Log4jLog(name);
}
}
// 对log4j的方法进行包装适配:isFatalEnabled、error、info … 最终调用具体的日志系统方法
private static class Log4jLog implements Log, Serializable {
private static final LoggerContext loggerContext =
LogManager.getContext(Log4jLog.class.getClassLoader(), false);
private final ExtendedLogger logger;
public Log4jLog(String name) {
this.logger = loggerContext.getLogger(name);
}
@Override
public boolean isFatalEnabled() {
return this.logger.isEnabled(Level.FATAL);
}
@Override
public void error(Object message) {
log(Level.ERROR, message, null);
}
@Override
public void info(Object message) {
log(Level.INFO, message, null);
}
}
来源:[]()
java中jcl,spring-jcl 日志源码分析相关推荐
- 【java】java中的线程池 ThreadPoolExecutor源码分析
文章目录 1.概述 4.源码 4.1 关键属性 4.2 构造函数 4.4 状态控制 4.5 ThreadLocalMap 4.6 execute方法源码分析 4.7 addWorker方法源码分析 4 ...
- Java中的锁大全(底层源码分析)
引用:https://tech.meituan.com/2018/11/15/java-lock.html 加锁过程:https://www.cnblogs.com/hkdpp/p/11917383. ...
- Java微服务组件Spring cloud ribbon源码分析
微服务组件Spring Cloud Ribbon源码分析_哔哩哔哩_bilibili Ribbon源码分析 | ProcessOn免费在线作图,在线流程图,在线思维导图 | 1.什么是ribbon? ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- Spring IOC 容器源码分析系列文章导读 1
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
- Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析-[Android取经之路]
摘要:本节主要来讲解Android10.0 logd.logcat读写日志源码内容 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...
- Spring IOC 容器源码分析 - 余下的初始化工作
1. 简介 本篇文章是"Spring IOC 容器源码分析"系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bea ...
- Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...
- Spring Developer Tools 源码分析:二、类路径监控
在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath ...
- Spring框架—SpringBean源码分析
原文作者:Javadoop 原文地址:Spring IOC 容器源码分析 在继续往下之前,我们需要先了解 BeanDefinition.我们说 BeanFactory 是 Bean 容器,那么 Bea ...
最新文章
- CCF201409-5 拼图(30分)
- Java 程序优化:字符串操作、基本运算方法等优化策略
- linux使用设备文件的目录,Linux系统下的/dev目录
- android中常见的错误及解决办法
- 被硅谷带火的Cloud Native,你究竟会不会玩儿?
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_1、SpringBoot2.x课程介绍和高手系列知识点...
- log4cxx OutputDebugString DebugView dbgview
- 动态数组索引越界问题
- golang 爆破破解 rar5 压缩文件密码
- 公众号封面图内容数据提取软件
- 雅虎邮箱,在foxmail 设置
- win10 kms activator
- javascript 图(Graphs)算法与说明
- css的语义---Cascading Style Sheet
- 2020校招搜狗笔试
- android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能
- 农村中学扩建工程全套CAD施工图哪里找?
- 3d wallpaper android,3D Parallax Wallpaper
- 【数据结构】栈和队列
- RHCSA环境配置简单命令
热门文章
- 九齐单片机NY8B062E的ADC零点校准程序记录
- 用nat123+tomcat 发布网站
- 三菱Q系列PLC CC_LINK远程IO站的使用
- 用友数据库服务器如何修改,怎样用友数据库服务器配置
- OSPO 五阶段成熟度模型解析
- Siemens.LMS.Samtech.Wind.Turbines.rev15.SL1.Win32_64 2DVD
- 20154313 刘文亨 EXP6
- 传世服务器上怎么修改升级经验,传世各级升级需要的经验
- 传奇sf服务器修改技能成功率,传奇游戏任务系统修改之打造带成功率的勋章任务详细攻略...
- 松下FP-XHC60T 标准中型程序,程序用于3C点胶设备,总共逻辑5千多步,含昆仑通态触摸屏程序