在介绍Mybatis日志实现前,我们先了解下java的日志体系以及日志框架的发展,目前比较常用的日志框架有下面几个:
而JCL和SLF4J属于日志接口(没有日志具体实现),提供统一的日志操作规范,而日志的实际功能逻辑是由具体的日志实现框架完成的(例如log4j、log4j2、logback等)。
二、Mybatis的日志实现
Mybatis通过Log接口来定义日志操作规范,接口内容如下:
Log实现类的逻辑比较简单,我们以Log4jImpl实现类为例 :
在Log4jImpl构造方法中,获取Log4j框架中的Logger对象,让后将日志的输出操作委托给这个Logger对象完成。其他日志实现类也是类似的。
Mybatis支持7种不同的日志输出策略,而在他是如何确认使用哪种日志?
Mybatis的Log实例采用工厂模式创建,下面是使用LogFactory获取Log的代码案例:
LogFactory还提供了其他方法用来指导哪种日志实现类输出日志:
可以看到,这些方法都会调用setImplementation该方法指定对应的日志实现类。我们看下这个方法:
首先获取Constructor对象,然后赋值给LogFactory的logConstructor属性,所以我们调用LogFactory类的useLog4JLogging方法时,就会使用到这个实现类进行输出日志,而Log4jImpl实现类又交给Log4J框架的去输出日志,这样就达到了使用log4j去输出日志的效果。
当我们没有指定使用哪种日志实现时,mybatis会按照顺序在Classpath下的日志框架相关的jar包,存在则使用其进行打印日志。
下面我们讲究mybatis怎么动态查找日志框架的实现细节,在LogFactory类中有一个初始化代码块:
如上面代码,调用LogFactory类的tryImplementation方法确认日志实现类,该方法入参为Runnable的匿名对象,在run方法中调用useSLF4JLogging等方法知道日志实现类。 tryImplementation方法的具体代码:(这里不是使用java的多线程,只是命名相同了)
在mybatis中,我们可以通过知道logImpl参数来设置使用哪种框架输出日志(需要先导入相应jar包依赖),例如:
另外Configuration类中维护了一个logImpl属性:
小结:
现在比较常用的是SLF4J+log4j2、SLF4J+logback的日志体系
Java的常用日志技术(三)Log4j2及Log4j2与slfj整合详解_log4j2 slf4j_爱吃面的猫的博客-CSDN博客
【Java】# 在项目中使用SLF4J+Logback来记录日志_LRcoding的博客-CSDN博客
logback依赖导入时不需要导入桥接的依赖,logback-classic中直接对Slf4j进行了实现。