【MyBatis】MyBatis的日志实现

13 篇文章 2 订阅
9 篇文章 0 订阅

目录

一、日志演变

二、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(日志门面 ,集成其他框架,不实现日志功能)....

日志门面 (日志的抽象层)

日志实现

JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging

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的日志选择也是存在着一个优先级顺序的,优先级如下:

  1. slf4j
  2. jcl
  3. log4j2
  4. log4j
  5. jul
  6. 不使用日志

所以MyBatisSpring 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的日志技术新特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值