Spring Boot + MyBatis-Plus:SLF4J+Logback 配置SQL日志到文件_mybatisplus+springboot+logback idea 打印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\"> <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>ACCEPT</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>ACCEPT</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>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <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>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <springProfile name=\"dev\"> <logger name=\"com.xxx.iotjava.mapper\" level=\"DEBUG\"> <appender-ref ref=\"MYBATIS_DEBUG_FILE\"/> </logger> <logger name=\"com.xxx.iotjava.service\" level=\"DEBUG\"> <appender-ref ref=\"MYBATIS_DEBUG_FILE\"/> </logger> <logger name=\"com.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=\"com.xxx.iotjava.mapper\" level=\"DEBUG\" additivity=\"false\"> <appender-ref ref=\"MYBATIS_DEBUG_FILE\"/> </logger> <logger name=\"com.xxx.iotjava.service\" level=\"DEBUG\" additivity=\"false\"> <appender-ref ref=\"MYBATIS_DEBUG_FILE\"/> </logger> <logger name=\"com.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>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter></appender>
MyBatis 日志记录级别设置
只有在 DEBUG 模式下,MyBatis 才会记录详细的 SQL 日志信息。
因此,需要确保相关日志记录器的级别设置为 DEBUG。
<logger name=\"com.xxx.iotjava.mapper\" level=\"DEBUG\"> <appender-ref ref=\"MYBATIS_DEBUG_FILE\"/></logger>
通过以上配置,您可以实现 MyBatis-Plus SQL 日志的控制台输出和文件记录。
这将有助于您在开发和生产环境中更好地监控和调试数据库操作。