目录
一、日志演变
二、MyBatis中实现日志管理
1.导入pom依赖
2.添加logback配置文件
3.日志打印
三、MyBatis日志技术实现原理
3.1 初始化
3.2 具体实现类
3.3 自己模拟实现mybaits的日志实现
四、架构系统如何考虑日志
一、日志演变
JDK 1.4之前 没有任何的日志框架,直接用系统输出用作日志打印。
System.out.println("")
需求痛点:
- 将日志按照级别输入,按照包或者类来输入。
- 将日志输入到文件中,能不能按照日期或者文件大小来进行归档,记录日志同时发送邮件给开发人员
- 自定义格式,让日志更美观
- 性能
基于以上需求,市面上开发出了各种日志框架,市面上的日志框架有:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j(日志门面 ,集成其他框架,不实现日志功能)....
日志门面 (日志的抽象层) | 日志实现 |
| Log4j JUL(java.util.logging) Log4j2 Logback |
左边选一个门面(抽象层)、右边来选一个实现;
日志门面: SLF4J; 官方文档: SLF4J
日志实现:Logback; 中文文档: 全球信誉最好的网投平台(中国)官方网站
二、MyBatis中实现日志管理
在MyBatis中也可以集成日志框架。步骤如下:
1.导入pom依赖
<!-- log start -->
<!-- 日志门面依赖 -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.30</version>
</dependency>
<!-- 具体实现日志框架 -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>
<!-- log end -->
2.添加logback配置文件
<configuration><!--appender 追加器 日志以哪种方式进行输出name 取个名字class 不同实现类会输出到不同地方ch.qos.logback.core.ConsoleAppender 输出到控制台--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 格式 --><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{100} - %msg%n</pattern></encoder></appender><!--cn.tulingxueyuan.mapper--><!--控制跟细粒度的日志级别 根据包\根据类--><logger name="cn.tulingxueyuan.mapper" level="debug"></logger><!-- org.apache.ibatis.transaction --><!--控制所有的日志级别--><root level="error"><!-- 将当前日志级别输出到哪个追加器上面 --><appender-ref ref="STDOUT" /></root>
</configuration>
3.日志打印
Logger LOGGER= LoggerFactory.getLogger(this.getClass());
/*** 日志级别* TRACE < DEBUG < INFO < WARN < ERROR。* 1 2 3 4 5*/@Test
public void test02(){LOGGER.trace("跟踪级别");LOGGER.debug("调试级别");LOGGER.info("信息级别");LOGGER.warn("警告级别");LOGGER.error("异常级别");
}
三、MyBatis日志技术实现原理
MyBatis的日志实现相对来说是比较简单的,下面我们直接去分析源码。
MyBatis的日志对象使用过LogFactory实例化创建的。
3.1 初始化
首先我们看LogFactory类中的静态代码块,很明显,这是一个按照顺序去尝试创建各种日志技术的对象的逻辑。由此可见,MyBatis的日志选择也是存在着一个优先级顺序的,优先级如下:
- slf4j
- jcl
- log4j2
- log4j
- jul
- 不使用日志
所以MyBatis和Spring Boot一样,都是优先使用slf4j去管理日志,Spring就是优先使用log4j2来打印日志。这是这三种框架日志选择规则的不同之处。
下面再来看tryImplementation方法源码
org.apache.ibatis.logging.LogFactory
private static void tryImplementation(Runnable runnable) {if (logConstructor == null) {try {runnable.run();} catch (Throwable t) {// ignore}}
}
关键代码 if (logConstructor == null),没有找到实现则接触该方法,继续找是否存在下一个日志技术。
3.2 具体实现类
MyBatis提供很多日志的实现类,用来记录日志,取决于初始化的时候load到的class
上图红色箭头可以看到JakartaCommonsLoggingImpl中引用了jcl 的类,如果在初始化的时候load到类为JakartaCommonsLoggingImpl,那么则使用jcl 去实现日志记录,但是也是顺序的,顺序参考上面讲过的源码。
3.3 自己模拟实现mybaits的日志实现
mybatis的官网关于日志的介绍
定义org.apache.ibatis.session.Configuration
参考org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl
分析为什么jcl不记录日志,修改代码
四、架构系统如何考虑日志
old:jcl + log4j
new:slf4j + jul
相关文章:【MyBatis】MyBatis的介绍和基本使用
【Spring】通用日志框架和spring 5的日志技术新特性