未央花博客 - spring日志
type: channel
link: http://www.pslanys.com/tag/spring%E6%97%A5%E5%BF%97/
items: spring和mybatis的日志

spring和mybatis的日志
type: item
date: 2020-09-06T17:23:00+08:00
description: 前言本文主要介绍的是spring5、spring4、mybatis日志源码中是具体如何加载具体的日志类，看完后你可以根据源码的加载顺序使用自己需要使用的日志。如有错误，欢迎指出spring当中的日志log4jlogbacklog4j2julslf4jjcl各种日志技术的关系和作用通过源码来分析spring的日志技术分别分析spring5和spring4的使用日志的区别通过源码分析mybaits的日志技术spring和mybatis整合通过注解设置自定义的日志主流的log技术名词log4j log4j log4j 1.2.17 可以不需要依赖第三方的技术，直接记录日志jcljakartaCommonsLoggingImpl commons-logging commons-logging 1.1.1 jcl他不直接记录日志,他是通过第三方记录日志(jul)，它是jdk自带的如果使用jcl来记录日志,在没有log4j的依赖情况下,是用jul如果有了log4j则使用log4jjcl=Jakarta commons-logging ,是apache公司开发的一个抽象日志通用框架,本身不实现日志记录,但是提供了记录日志的抽象方法即接口(info,debug,error.......),底层通过一个数组存放具体的日志框架的类名,然后循环数组依次去匹配这些类名是否在app中被依赖了,如果找到被依赖的则直接使用,所以他有先后顺序。上图为jcl中存放日志技术类名的数组，默认有四个，后面两个可以忽略，因为都是jdk1.3以前的。上图81行就是通过一个类名去load一个class，如果load成功则直接new出来并且返回使用。如果没有load到class这循环第二个，直到找到为止。可以看到这里的循环条件必须满足result不为空，也就是如果没有找到具体的日志依赖则继续循环，如果找到则条件不成立，不进行循环了。总结：顺序log4j>juljuljava自带的一个日志记录的技术,直接使用log4j2slf4jslf4j他也不记录日志,通过绑定器绑定一个具体的日志记录来完成日志记录绑定器、桥接器问题slf4j -->通过绑定器-->jcl -->通过桥接器--> jcl ====> 会导致内存溢出logbacksimple-log各种日志技术的关系和作用spring日志技术分析spring5.*日志技术实现spring5使用的spring的jcl(spring改了jcl的代码)来记录日志的,但是jcl不能直接记录日志,默认是使用JUL记录，但是只要引入了log4j2、slf4j等，就会被重新赋值改变（在static静态块中）源代码展示org.apache.commons.logging.LogFactory类里面被调用的最多的方法：// 这个方法，调用本类的getLog()方法 public static Log getLog(Class<?> clazz) { return getLog(clazz.getName()); } public static Log getLog(String name) { return LogAdapter.createLog(name); }org.apache.commons.logging.LogAdapter类静态变量和静态代码块会在类的实例化之前被加载，具体是在类加载过程的初始化阶段，会在编译器生成的clinit方法中被调用，执行的顺序有源文件中出现的顺序一致/** * Create an actual {@link Log} instance for the selected API. * 这个方法就是返回具体的实例 */ public static Log createLog(String name) { // 通过静态变量logApi具体的值来加载日志 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 final String LOG4J_SPI = "org.apache.logging.log4j.spi.ExtendedLogger"; private static final String LOG4J_SLF4J_PROVIDER = "o…