Spring Boot + MyBatis-Plus:SLF4J+Logback 配置SQL日志到文件

Spring Boot + MyBatis-Plus:SLF4J+Logback 配置SQL日志到文件

01 背景

在开发 Spring Boot 项目时,常常需要将 SQL 语句记录到日志文件中,以便进行问题排查和性能监控。

本文将详细讲解如何配置 MyBatis-Plus 3.3.2 版本,使其能够将 SQL 语句输出到日志文件。

02官方配置与改进

替换默认日志实现
根据官方文档,MyBatis-Plus 默认的日志实现是 org.apache.ibatis.logging.stdout.StdOutImpl,仅能将日志输出到控制台。

为了实现日志文件记录,需将其替换为 org.apache.ibatis.logging.slf4j.Slf4jImpl,具体配置如下:

mybatis-plus:
  configuration:
    # 使用 SLF4J 实现日志记录
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

配置 Logback 输出

替换默认日志实现后,控制台将不再显示日志输出,因此需要配置 Logback-Spring.xml 文件,以实现日志的控制台和文件双重输出。

<configuration scan="true" scanPeriod="10 seconds">

    <!-- 引入 Spring 的 application.properties 文件中的变量 -->
    <springProperty scope="context" name="serviceName" source="spring.application.name" />

    <!-- 定义日志文件存储路径 -->
    <property name="log.path" value="/home/logs/WorkIotJavaService" />

    <!-- 定义日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%magenta(%msg%n)"/>

    <!-- 控制台日志输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 信息级别日志文件 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/%datetime/log_info.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%datetime/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>A***EPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 警告级别日志文件 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/%datetime/log_warn.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%datetime/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>A***EPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 错误级别日志文件 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/%datetime/log_error.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%datetime/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>A***EPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- MyBatis SQL 日志文件 -->
    <appender name="MYBATIS_DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/%datetime/log_mybatis_sql.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%datetime/mybatisSql/log-mybatis-sql-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>A***EPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 开发环境日志配置 -->
    <springProfile name="dev">
        <logger name="***.xxx.iotjava.mapper" level="DEBUG">
            <appender-ref ref="MYBATIS_DEBUG_FILE"/>
        </logger>
        <logger name="***.xxx.iotjava.service" level="DEBUG">
            <appender-ref ref="MYBATIS_DEBUG_FILE"/>
        </logger>
        <logger name="***.baomidou.mybatisplus" level="DEBUG">
            <appender-ref ref="MYBATIS_DEBUG_FILE"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>

    <!-- 生产环境日志配置 -->
    <springProfile name="prd">
        <logger name="***.xxx.iotjava.mapper" level="DEBUG" additivity="false">
            <appender-ref ref="MYBATIS_DEBUG_FILE"/>
        </logger>
        <logger name="***.xxx.iotjava.service" level="DEBUG" additivity="false">
            <appender-ref ref="MYBATIS_DEBUG_FILE"/>
        </logger>
        <logger name="***.baomidou.mybatisplus" level="DEBUG" additivity="false">
            <appender-ref ref="MYBATIS_DEBUG_FILE"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="SendErrorMsgAppender"/>
        </root>
    </springProfile>

</configuration>

03重点说明

控制台日志级别调整

在 Logback 配置中,将控制台日志输出级别设置为 DEBUG,以确保能够捕获 MyBatis-Plus 的调试信息。

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>DEBUG</level>
    </filter>
    <encoder>
        <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

MyBatis SQL 日志文件配置
MyBatis SQL 日志文件配置如下:

<appender name="MYBATIS_DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/%datetime/log_mybatis_sql.log</file>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/%datetime/mybatisSql/log-mybatis-sql-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>DEBUG</level>
        <onMatch>A***EPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

MyBatis 日志记录级别设置
只有在 DEBUG 模式下,MyBatis 才会记录详细的 SQL 日志信息。

因此,需要确保相关日志记录器的级别设置为 DEBUG。

<logger name="***.xxx.iotjava.mapper" level="DEBUG">
    <appender-ref ref="MYBATIS_DEBUG_FILE"/>
</logger>

通过以上配置,您可以实现 MyBatis-Plus SQL 日志的控制台输出和文件记录。

这将有助于您在开发和生产环境中更好地监控和调试数据库操作。

转载请说明出处内容投诉
CSS教程网 » Spring Boot + MyBatis-Plus:SLF4J+Logback 配置SQL日志到文件

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买