logback+slf4j解决Mybatis执行sql写入日志文件的问题(亲测可行)

本文介绍如何在Mybatis中调整日志级别,将执行的SQL和结果定向到不同日志文件,提高生产环境的日志效率,同时保持DEBUG级别日志的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

一、问题描述

在生产上遇到问题时,经常需要查询日志文件,有时会需要查询执行的sql以及执行结果,所以Mybatis执行sql不仅要能在控制台打印输出,还要能写入日志文件待查。之前看过的好多博客只是解决了日志向控制台打印的问题。
由于Mybatis执行sql的日志级别为DEBUG,一般生产上需要的日志级别为INFO及以上。如果将DEBUG级别日志全部写入日志文件,会造成日志查问题的速度降低,难度大大提高。所以Mybatis执行sql的日志只能向更高日志级别的日志文件追加或单独写入一个文件。

二、解决方案

application.properties加上日志配置,不能使用StdOutImpl,因为这种配置只能打印控制台

mybatis.configuration.log-impl= org.apache.ibatis.logging.slf4j.Slf4jImpl

logback-spring.xml中下图配置关键
在这里插入图片描述

logback-spring.xml写法

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration debug="true" scan="true" scanperiod="1800 seconds">
    <!-- 定义属性,类似于maven,可以当做变量被引用 -->
    <springProperty scope="context" name="APP_NAME" source="logback.appName" defaultValue=项目名或模块名/>
    <springProperty scope="context" name="LOG_HOME" source="logback.logHome" defaultValue=日志存放路径/>
    <springProperty scope="context" name="LOG_LEVEL" source="logback.logLevel" defaultValue="info"/>

    <!-- 输出到控制台 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %tid [%thread] %-5level %logger{50} - %msg%n</Pattern>
        </encoder>
    </appender>
      <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %tid [%thread] %-5level %logger{50} - %msg%n"/>
    <!-- 输出到文件,根据大小和时间来切分 -->
    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${APP_NAME}-info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按日滚动,注意%i是必须的,表示文件的索引号,从0开始累加 -->
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i-info.log</fileNamePattern>
            <!-- 每个文件最大为100MB,最多保存60个文件数量,并且所有文件总和不能大于20GB。 -->
            <maxFileSize>200MB</maxFileSize>
            <maxHistory>150</maxHistory>
            <totalSizeCap>30GB</totalSizeCap>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>

        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder>
    </appender>
     <!-- 输出到文件,根据大小和时间来切分 -->
    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${APP_NAME}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按日滚动,注意%i是必须的,表示文件的索引号,从0开始累加 -->
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i-error.log</fileNamePattern>
            <!-- 每个文件最大为100MB,最多保存60个文件数量,并且所有文件总和不能大于20GB。 -->
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>100</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>

        <!-- 仅输出ERROR以上级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder>
    </appender>

    <appender name="sqlFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${APP_NAME}-sql.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按日滚动,注意%i是必须的,表示文件的索引号,从0开始累加 -->
            <fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.%i-sql.log</fileNamePattern>
            <!-- 每个文件最大为100MB,最多保存60个文件数量,并且所有文件总和不能大于20GB。 -->
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>100</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
        </encoder>
    </appender>


    <logger name=mapper的包路径或Dao层路径 level="debug">
         <!-- 追加到sqlFile日志文件中,文件名与上文定义的日志文件名要一致-->
        <appender-ref ref="sqlFile" />
         <!-- 追加到infoFile日志文件中,文件名与上文定义的日志文件名要一致 -->
        <appender-ref ref="infoFile" />
    </logger>



    <!-- 配置根节点。指定日志的默认基本和输出方向。 -->
    <root level="${LOG_LEVEL}">
        <appender-ref ref="stdout" />
        <appender-ref ref="infoFile" />
        <appender-ref ref="errorFile" />
    </root>
</configuration>
### 配置 Logback 以支持 MyBatis 日志记录 对于希望集成 `Logback` `MyBatis` 的开发者来说,配置合适的日志框架可以极大地提高开发效率并简化调试过程。当涉及到具体实现时,主要工作集中在编辑项目的 `logback.xml` 文件上。 #### 设置基础结构 确保项目已引入必要的依赖项以便能够正常使用 `SLF4J` 接口以及 `Logback` 实现。通常情况下,Maven 或 Gradle 构建工具中的 pom.xml 或 build.gradle 应该包含如下依赖: ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> <!-- SLF4J API --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Logback Classic Implementation --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> ``` #### 编辑 logback.xml 文件 接下来是在资源目录下创建或修改现有的 `logback.xml` 文件来定制化日志行为。下面是一个适用于大多数场景的基础模板,特别是针对想要查看 SQL 查询语句及其参数的情况[^1]。 ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <!-- 定义日志文件的位置名称 --> <property name="LOG_PATH" value="./logs"/> <!-- 控制台输出格式 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 将日志写入文件 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${LOG_PATH}/application.log</file> <append>true</append> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender> <!-- 特定于 MyBatis 的 logger, 显示 SQL 执行详情 --> <logger name="com.example.mapper" level="DEBUG"/> <!-- 对 org.apache.ibatis 包下的所有类启用 DEBUG 级别的日志 --> <logger name="org.apache.ibatis" level="DEBUG"/> <!-- Root Logger Configuration --> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> </root> </configuration> ``` 上述 XML 中的关键部分在于 `<logger>` 节点的定义,这里指定了哪些包应该被赋予特定的日志级别。通过将 `name` 属性设置为 `"org.apache.ibatis"` 可以捕获来自 MyBatis 组件的所有消息;而如果只想监控某个具体的 Mapper 类,则可将其全限定名作为此属性值传递给对应的节点实例[^2]。 此外,值得注意的是,默认情况下 Spring Boot 已经集成了对多种流行日志库的支持,并提供了合理的默认配置选项。因此,在某些简单应用场景里或许并不需要额外编写复杂的自定义规则就能满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值