Mybatis源码(七)mybatis的日志体系

今天我们来谈下mybatis的日志体系。说到mybatis的日志体系我们不得不说下java的日志体系。java的日志体系真的太多了。有log4jjuljcl等等。因为java是一个开源的语言。所以难免有很多的日志框架。今天我们就来说下java的日志体系,然后再说下mybatis的日志体系。

首先我们先来看下log4j,写出如下的代码,测试一下。

我们先引入对应的依赖,具体的代码如下:

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

然后就是log4j.properties

log4j.rootLogger=debug, stdout
log4j.logger.org.apache.ibatis=debug
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

测试的类

import org.apache.log4j.Logger;

public class Log4jMain {
  public static void main(String[] args) {
    Logger logger = Logger.getLogger("log4j");
    logger.info("log4j");
  }
}

运行的结果如下:

在这里插入图片描述

以上就是log4j的使用。

我们再来看下jul,具体的代码如下:

import java.util.logging.Logger;
public class JULMain {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger("jul");
        logger.info("jul");
    }
}

运行结果如下:‘

在这里插入图片描述

可以看出打印出来的信息是红色的,我们暂且用颜色来区分是log4j还是jul

很明显这些日志都有缺点,就是不支持日志切换和日志整合。假设你们项目要切换日志系统,这个时候如果是使用log4jjul就无法实现日志的切换。如果要切换的话,就要改很多的代码。于是有了jcl。具体的测试如下:

先引入对应的依赖

<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.2</version>
</dependency>

编写的代码如下:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class JCLMain {
 public static void main(String[] args) {
   Log logger = LogFactory.getLog("jcl");
   logger.info("jcl");
 }
}

运行的结果如下:

在这里插入图片描述

可以发现用的是log4j打印的。如果这个时候我们将log4j的依赖去除,这儿会用什么日志体系打印,具体如下:

在这里插入图片描述

你会发现这儿是用jul打印的。也就是jcl解决了日志的切换的问题。但是它没有解决日志的整合的问题。jcl的原理图如下:

在这里插入图片描述

那么有没有一种日志的技术,既解决了日志切换的问题,同时也解决了日志整合的问题。当然有了,就是slf4j,具体的使用如下:

<!--日志的门面-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.30</version>
</dependency>

<!--绑定器-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.30</version>
</dependency>

书写的代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Slf4jMain {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger("slf4j");
    logger.info("slf4j");
  }
}

运行的结果如下;

在这里插入图片描述

如果我们要切换到jul怎么办?这个时候我们只需要换一个绑定器,就行了。注意:绑定器只能有一个。

<!--日志的门面-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.30</version>
</dependency>

<!--绑定器-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>1.7.30</version>
</dependency>

然后运行的结果如下:

在这里插入图片描述

这个时候调用的jul的打印日志了,那么日志的切换是可以通过绑定器来进行切换了。那么日志的整合怎么做呢?具体的代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class JULLog {
  public static void log(){
    Logger logger = LoggerFactory.getLogger(JULLog.class.getName());
    logger.info("JULLog");
  }
}
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class JCLLog {
  public static void log(){
    Log logger = LogFactory.getLog("jcl");
    logger.info("JCLLog");
  }
}

public class Integration {
  public static void main(String[] args) {
    JULLog.log();
    JCLLog.log();
  }
}

运行的结果如下:

在这里插入图片描述

你会发现两种日志都打印了。那我们该怎么将这两个日志给整合成一个呢?slf4j中有个桥接器。专门用来解决日志整合的问题。只需要引入下面的依赖即可

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.30</version>
</dependency>

运行的结果如下:

在这里插入图片描述

你可以看到加了一个桥接器,就可以将jcl打印的日志转成了jul的日志,所以日志的整合的功能也就实现了。slf4j日志的架构图具体如下:

在这里插入图片描述

在这里插入图片描述

至此整个java的日志的体系就讲完了。那么mybatis中的日志体系又是什么样。让笔者为你们细细道来。在mybatis中使用日志,只需要在主配置文件中配置如下的节点就可以

<setting name="logImpl" value="LOG4J" />

这个LOG4Jmybatis在初始化的时候就加入到typeAliasRegistryMap集合中。然后我们看下指定日志的实现的代码,具体如下:

public class XMLConfigBuilder extends BaseBuilder {
  private void loadCustomLogImpl(Properties props) {
    Class<? extends Log> logImpl = resolveClass(props.getProperty("logImpl"));
    configuration.setLogImpl(logImpl);
  }
}

public class Configuration {
	public void setLogImpl(Class<? extends Log> logImpl) {
    if (logImpl != null) {
      this.logImpl = logImpl;
      LogFactory.useCustomLogging(this.logImpl);
    }
  }
}

public final class LogFactory {
  static {
    //在用户没有指定日志的情况下
    tryImplementation(LogFactory::useSlf4jLogging);//先slf4j
    tryImplementation(LogFactory::useCommonsLogging);//jcl
    tryImplementation(LogFactory::useLog4J2Logging);//log4j2
    tryImplementation(LogFactory::useLog4JLogging);//log4j
    tryImplementation(LogFactory::useJdkLogging);//jul
    tryImplementation(LogFactory::useNoLogging);//没有日志
  }
}

可以看到mybatis选取日志的原理是先看你有没有配置。如果有配置就用你配资的。如果没有配置 他自己有一个实例化的流程。就是上面的静态方法的实例化的过程。至此mybatis的日志体系就说完了。其实重点是java的日志体系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值