日志是框架必不可少的一个部分,它有助于开发人员排除和发现问题。在 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 接口,此接口中定义了 error
、debug
、trace
、 warn
等方法。
不同的实现类在实现这些方法时,都是调用不同的日志框架中的类方法实现。
以接口的 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);
}
...
}
其它实现类的套路也差不多,都是在具体实现类的 error
、debug
、trace
、 warn
方法中,去调用不同日志框架中的类,从而输出日志。
在设计模式中,这种称为适配器模式。