Mybatis 框架日志相关源码分析(一)

技术 · 2023-04-07

日志是框架必不可少的一个部分,它有助于开发人员排除和发现问题。在 Mybatis 框架中,通过内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j (3.5.9 起废弃)
  • JDK logging
本文将分析 Mybatis 框架的日志相关源码,了解适配器模式在日志源码中的应用。

先从配置说起,配置 Mybatis 日志,是通过在 mybatis-config.xml 文件里面添加一项 setting 来使用:

<configuration>
  <settings>
    ...
    <setting name="logImpl" value="LOG4J"/>
    ...
  </settings>
</configuration>

上面所示的 value 值为:LOG4J ,这是 Mybatis 可选的几个值之一,通过源码 Configuration#205 可知所有 value 可选值,以及对应的实现类:

typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);
typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class);
typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);
typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);
typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);
typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);
typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);

接着,我们继续对实现类分析,可以发现所有的实现类,都继承自 Log 接口,此接口中定义了 errordebugtracewarn 等方法。

不同的实现类在实现这些方法时,都是调用不同的日志框架中的类方法实现。

以接口的 debug 方法为例,在实现类 Jdk14LoggingImpl.class 中,使用的是 java.util.logging 包下的 Logger 方法输出日志。

import java.util.logging.Level;
import java.util.logging.Logger;

public class Jdk14LoggingImpl implements Log {
  private final Logger log;
  ...
  @Override
  public void debug(String s) {
    log.log(Level.FINE, s);
  }
  ...
}

其它实现类的套路也差不多,都是在具体实现类的 errordebugtracewarn 方法中,去调用不同日志框架中的类,从而输出日志。

在设计模式中,这种称为适配器模式。

Java MyBatis
  1. 优惠券 2023-06-23

    博文写的好高大上 ?

    虽然我压根就看不懂 ?

    但还是点赞支持一波吧 ?

    只因为感觉博主是位大佬 ?

Theme Jasmine by Kent Liao