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 日志的控制台输出和文件记录。
这将有助于您在开发和生产环境中更好地监控和调试数据库操作。