在介绍Mybatis日志实现前,我们先了解下java的日志体系以及日志框架的发展,目前比较常用的日志框架有下面几个:

而JCL和SLF4J属于日志接口(没有日志具体实现),提供统一的日志操作规范,而日志的实际功能逻辑是由具体的日志实现框架完成的(例如log4j、log4j2、logback等)。

springboot mybatis 关闭日志 mybatis的日志_日志框架

springboot mybatis 关闭日志 mybatis的日志_java_02

 

springboot mybatis 关闭日志 mybatis的日志_log4j_03

 

二、Mybatis的日志实现

 Mybatis通过Log接口来定义日志操作规范,接口内容如下:

springboot mybatis 关闭日志 mybatis的日志_log4j_04

springboot mybatis 关闭日志 mybatis的日志_log4j_05

 Log实现类的逻辑比较简单,我们以Log4jImpl实现类为例 :

springboot mybatis 关闭日志 mybatis的日志_java_06

在Log4jImpl构造方法中,获取Log4j框架中的Logger对象,让后将日志的输出操作委托给这个Logger对象完成。其他日志实现类也是类似的。

Mybatis支持7种不同的日志输出策略,而在他是如何确认使用哪种日志?

Mybatis的Log实例采用工厂模式创建,下面是使用LogFactory获取Log的代码案例:

springboot mybatis 关闭日志 mybatis的日志_log4j_07

 LogFactory还提供了其他方法用来指导哪种日志实现类输出日志:

springboot mybatis 关闭日志 mybatis的日志_mybatis_08

可以看到,这些方法都会调用setImplementation该方法指定对应的日志实现类。我们看下这个方法:

springboot mybatis 关闭日志 mybatis的日志_Java_09

首先获取Constructor对象,然后赋值给LogFactory的logConstructor属性,所以我们调用LogFactory类的useLog4JLogging方法时,就会使用到这个实现类进行输出日志,而Log4jImpl实现类又交给Log4J框架的去输出日志,这样就达到了使用log4j去输出日志的效果。

 当我们没有指定使用哪种日志实现时,mybatis会按照顺序在Classpath下的日志框架相关的jar包,存在则使用其进行打印日志。

下面我们讲究mybatis怎么动态查找日志框架的实现细节,在LogFactory类中有一个初始化代码块:

springboot mybatis 关闭日志 mybatis的日志_mybatis_10

如上面代码,调用LogFactory类的tryImplementation方法确认日志实现类,该方法入参为Runnable的匿名对象,在run方法中调用useSLF4JLogging等方法知道日志实现类。 tryImplementation方法的具体代码:(这里不是使用java的多线程,只是命名相同了)

springboot mybatis 关闭日志 mybatis的日志_log4j_11

 

springboot mybatis 关闭日志 mybatis的日志_日志框架_12

在mybatis中,我们可以通过知道logImpl参数来设置使用哪种框架输出日志(需要先导入相应jar包依赖),例如:

springboot mybatis 关闭日志 mybatis的日志_mybatis_13

 

springboot mybatis 关闭日志 mybatis的日志_log4j_14

另外Configuration类中维护了一个logImpl属性:

springboot mybatis 关闭日志 mybatis的日志_Java_15

小结:

 

springboot mybatis 关闭日志 mybatis的日志_log4j_16

 

现在比较常用的是SLF4J+log4j2、SLF4J+logback的日志体系

Java的常用日志技术(三)Log4j2及Log4j2与slfj整合详解_log4j2 slf4j_爱吃面的猫的博客

【Java】# 在项目中使用SLF4J+Logback来记录日志_LRcoding的博客

logback依赖导入时不需要导入桥接的依赖,logback-classic中直接对Slf4j进行了实现。