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 日志源码分析相关推荐

  1. 【java】java中的线程池 ThreadPoolExecutor源码分析

    文章目录 1.概述 4.源码 4.1 关键属性 4.2 构造函数 4.4 状态控制 4.5 ThreadLocalMap 4.6 execute方法源码分析 4.7 addWorker方法源码分析 4 ...

  2. Java中的锁大全(底层源码分析)

    引用:https://tech.meituan.com/2018/11/15/java-lock.html 加锁过程:https://www.cnblogs.com/hkdpp/p/11917383. ...

  3. Java微服务组件Spring cloud ribbon源码分析

    微服务组件Spring Cloud Ribbon源码分析_哔哩哔哩_bilibili Ribbon源码分析 | ProcessOn免费在线作图,在线流程图,在线思维导图 | 1.什么是ribbon? ...

  4. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  5. Spring IOC 容器源码分析系列文章导读 1

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  6. Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析-[Android取经之路]

    摘要:本节主要来讲解Android10.0 logd.logcat读写日志源码内容 阅读本文大约需要花费20分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  7. Spring IOC 容器源码分析 - 余下的初始化工作

    1. 简介 本篇文章是"Spring IOC 容器源码分析"系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bea ...

  8. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  9. Spring Developer Tools 源码分析:二、类路径监控

    在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath ...

  10. Spring框架—SpringBean源码分析

    原文作者:Javadoop 原文地址:Spring IOC 容器源码分析 在继续往下之前,我们需要先了解 BeanDefinition.我们说 BeanFactory 是 Bean 容器,那么 Bea ...

最新文章

  1. CCF201409-5 拼图(30分)
  2. Java 程序优化:字符串操作、基本运算方法等优化策略
  3. linux使用设备文件的目录,Linux系统下的/dev目录
  4. android中常见的错误及解决办法
  5. 被硅谷带火的Cloud Native,你究竟会不会玩儿?
  6. 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_1、SpringBoot2.x课程介绍和高手系列知识点...
  7. log4cxx OutputDebugString DebugView dbgview
  8. 动态数组索引越界问题
  9. golang 爆破破解 rar5 压缩文件密码
  10. 公众号封面图内容数据提取软件
  11. 雅虎邮箱,在foxmail 设置
  12. win10 kms activator
  13. javascript 图(Graphs)算法与说明
  14. css的语义---Cascading Style Sheet
  15. 2020校招搜狗笔试
  16. android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能
  17. 农村中学扩建工程全套CAD施工图哪里找?
  18. 3d wallpaper android,3D Parallax Wallpaper
  19. 【数据结构】栈和队列
  20. RHCSA环境配置简单命令

热门文章

  1. 九齐单片机NY8B062E的ADC零点校准程序记录
  2. 用nat123+tomcat 发布网站
  3. 三菱Q系列PLC CC_LINK远程IO站的使用
  4. 用友数据库服务器如何修改,怎样用友数据库服务器配置
  5. OSPO 五阶段成熟度模型解析
  6. Siemens.LMS.Samtech.Wind.Turbines.rev15.SL1.Win32_64 2DVD
  7. 20154313 刘文亨 EXP6
  8. 传世服务器上怎么修改升级经验,传世各级升级需要的经验
  9. 传奇sf服务器修改技能成功率,传奇游戏任务系统修改之打造带成功率的勋章任务详细攻略...
  10. 松下FP-XHC60T 标准中型程序,程序用于3C点胶设备,总共逻辑5千多步,含昆仑通态触摸屏程序