标签:很多 string 日志输出 方式 nts connect base apt enable
本文,我们来分享 MyBatis 的日志模块,对应 logging
包。如下图所示:
在 《精尽 MyBatis 源码解析 —— 项目结构一览》 中,简单介绍了这个模块如下:
无论在开发测试环境中,还是在线上生产环境中,日志在整个系统中的地位都是非常重要的。良好的日志功能可以帮助开发人员和测试人员快速定位 Bug 代码,也可以帮助运维人员快速定位性能瓶颈等问题。目前的 Java 世界中存在很多优秀的日志框架,例如 Log4j、 Log4j2、Slf4j 等。
MyBatis 作为一个设计优良的框架,除了提供详细的日志输出信息,还要能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。
本文涉及的类如下图所示:
另外,《MyBatis 文档 —— 日志》 一文,也对日志模块做了简单的介绍,不熟悉这块的胖友,也可以看看。
下面,让我们开始干源码吧。
org.apache.ibatis.logging.LogFactory
,Log 工厂类。
// LogFactory.java
|
<1>
处,我们可以看到,按照 Slf4j、CommonsLogging、Log4J2Logging、Log4JLogging、JdkLogging、NoLogging 的顺序,逐个尝试,判断使用哪个 Log 的实现类,即初始化 logConstructor
属性。#tryImplementation(Runnable runnable)
方法,判断使用哪个 Log 的实现类。代码如下:
// LogFactory.java
|
当 logConstructor
为空时,执行 runnable
的方法。那么,runnable
怎么来的呢。实际上,<1>
处,使用了 Lambda 表达式,所以看起来不是很清晰。即 tryImplementation(LogFactory::useSlf4jLogging)
代码块,对应为:
tryImplementation(new Runnable() {
|
#useSlf4jLogging()
方法,尝试使用 Slf4j 。代码如下:
// LogFactory.java
|
在该方法内部,会调用 #setImplementation(Class<? extends Log> implClass)
方法,尝试使用指定的 Log 实现类,例如此处为 org.apache.ibatis.logging.slf4j.Slf4jImpl
。代码如下:
// LogFactory.java
|
logConstructor
。也就是说,其它类,就不会执行到该方法啦。其它 Log 类的该方法,代码如下:
// LogFactory.java
|
当然,也可以通过 #useCustomLogging(Class<? extends Log> clazz)
方法,设置自定义的 Log 实现类。代码如下:
// LogFactory.java
|
#getLog(...)
方法,获得 Log 对象。代码如下:
// LogFactory.java
|
org.apache.ibatis.logging.Log
,MyBatis Log 接口。代码如下:
// Log.java
|
Log 的实现类较多,我们就看看 Slf4jImpl 和 StdOutImpl 这两个实现类。
org.apache.ibatis.logging.stdout.StdOutImpl
,实现 Log 接口,StdOut 实现类。代码如下:
// StdOutImpl.java
|
System.out
和 System.err
来实现。org.apache.ibatis.logging.slf4j.Slf4jImpl
,实现 Log 接口,Slf4j 实现类。代码如下:
// Slf4jImpl.java
|
org.apache.ibatis.logging.slf4j.Slf4jLocationAwareLoggerImpl
和 org.apache.ibatis.logging.slf4j.Slf4jLoggerImpl
类。在 org.apache.ibatis.logging
包下的 jdbc
包,有如下五个类:
标签:很多 string 日志输出 方式 nts connect base apt enable
原文地址:https://www.cnblogs.com/siye1989/p/11621570.html