在使用 MyBatis 进行开发时,日志功能是非常重要的,它不仅有助于调试和追踪 SQL 执行过程,还能帮助开发人员监控和优化数据库操作。MyBatis 的日志机制灵活且功能强大,支持多种日志框架的集成。

1. MyBatis 内置日志

MyBatis 内置了一个简单的日志机制,用于记录 MyBatis 执行的 SQL 语句。默认情况下,MyBatis 会使用 SLF4J 作为日志接口,并支持多种日志框架的实现,比如 Log4jLogbackCommons Logging 等。

2. 配置 MyBatis 日志

2.1. 配置日志实现

在 MyBatis 中,日志实现是通过 logImpl 属性来指定的,通常该配置放在 mybatis-config.xml 文件中。例如:

<configuration>
    <!-- 配置 MyBatis 日志实现 -->
    <settings>
        <setting name="logImpl" value="SLF4J" />
    </settings>
</configuration>

在这里,logImpl 可以有多个可选值:

  • SLF4J:推荐使用,支持所有常见的日志框架。
  • Log4j:集成 Log4j 1.x。
  • Log4j2:集成 Log4j 2.x。
  • Commons Logging:适用于 Apache Commons Logging。
  • STDOUT_LOGGING:输出到控制台。
  • JDK_LOGGING:使用 JDK 自带的日志记录。

2.2. 配置 SLF4J + Logback

在生产环境中,通常推荐使用 SLF4J 和 Logback 进行日志记录,下面是如何配置的步骤:

  1. 添加相关依赖

在 pom.xml 中添加 SLF4J 和 Logback 的依赖。

<dependencies>
    <!-- SLF4J -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.32</version>
    </dependency>
    
    <!-- SLF4J Logback 实现 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.6</version>
    </dependency>
</dependencies>
  1. 配置 MyBatis 日志实现

在 mybatis-config.xml 中设置日志实现为 SLF4J

<configuration>
    <settings>
        <setting name="logImpl" value="SLF4J"/>
    </settings>
</configuration>
  1. 配置 Logback

在 src/main/resources 目录下创建 logback.xml 文件,配置日志输出格式、日志级别等。

<configuration>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="debug">
        <appender-ref ref="stdout" />
    </root>
</configuration>

在 Logback 配置中,日志级别可以设置为 TRACEDEBUGINFOWARNERROR,根据需要选择适合的日志级别。

2.3. 配置 Log4j

如果你更喜欢使用 Log4j,只需将 logImpl 配置为 Log4j

<configuration>
    <settings>
        <setting name="logImpl" value="Log4j"/>
    </settings>
</configuration>

然后在 pom.xml 中添加 Log4j 依赖:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

配置 Log4j 的 log4j.properties 文件:

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - %msg%n

2.4. 配置 Commons Logging

Commons Logging 是 Apache 提供的日志库,它也可以作为 MyBatis 的日志实现。如果想使用 Commons Logging,设置 logImpl 为 CommonsLogging

<configuration>
    <settings>
        <setting name="logImpl" value="CommonsLogging"/>
    </settings>
</configuration>

并添加相应的依赖:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

3. MyBatis 日志输出内容

无论使用哪种日志实现,MyBatis 会记录以下内容:

  • SQL 语句:所有执行的 SQL 语句。
  • 参数:绑定到 SQL 的参数。
  • 执行时间:每个 SQL 语句执行的时间。
  • 结果:执行 SQL 后返回的结果。

默认情况下,MyBatis 会输出以下信息:

==>  Preparing: select * from user where id = ? 
==> Parameters: 1(Integer)
<==    Columns: id, name, age
<==        Row: 1, John, 28
<==      Total: 1

4. 自定义 MyBatis 日志

MyBatis 提供了灵活的自定义日志记录方式。你可以通过实现 org.apache.ibatis.logging.Log 接口来创建自己的日志实现。

例如,我们可以创建一个简单的日志实现类:

package com.example.mybatis.logging;

import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;

public class MyCustomLog implements Log {
    
    private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MyCustomLog.class);

    public MyCustomLog(String clazz) {
        // 构造函数可以传入日志类的名称
    }

    @Override
    public void debug(String s) {
        logger.debug(s);
    }

    @Override
    public void error(String s) {
        logger.error(s);
    }

    @Override
    public void warn(String s) {
        logger.warn(s);
    }

    @Override
    public void info(String s) {
        logger.info(s);
    }

    @Override
    public boolean isDebugEnabled() {
        return logger.isDebugEnabled();
    }

    @Override
    public boolean isErrorEnabled() {
        return logger.isErrorEnabled();
    }

    @Override
    public boolean isWarnEnabled() {
        return logger.isWarnEnabled();
    }

    @Override
    public boolean isInfoEnabled() {
        return logger.isInfoEnabled();
    }
}

然后在 mybatis-config.xml 文件中使用 MyCustomLog

<configuration>
    <settings>
        <setting name="logImpl" value="com.example.mybatis.logging.MyCustomLog"/>
    </settings>
</configuration>

5. 监控与调试

在开发阶段,日志可以帮助你调试 SQL 执行的过程。通过查看 SQL 输出、执行时间和参数,你可以更容易地识别性能问题和错误。你可以根据需要调整日志的级别,例如将日志级别设为 TRACE 以获取更详细的执行信息。

总结

通过配置 MyBatis 日志,我们可以轻松地监控 SQL 执行情况、调试代码和优化性能。MyBatis 支持多种日志框架,如 SLF4JLog4jCommons Logging 等,你可以根据项目需求选择适合的日志实现。

通过合理配置日志和查看日志输出,我们能够有效追踪 SQL 执行、发现潜在问题,并在开发和生产环境中实现精细化的日志管理。