一、概述
最近想让mybatis打印sql执行的日志,好确定执行的到底对不对。
项目是springboot项目,dao层是在接口类上用@Mapper
注解实现的,以及resources文件夹里的mapper.xml
文件。
二、maven
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
三、logback.xml
主要就是这个,这个是日志文件的配置类,放在springboot项目resources
文件夹下。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志保存位置 -->
<property name="log.path" value="./logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- console输出格式,控制台用 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- file_info 输出格式,写日志文件用 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 让日志按天记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件输出位置 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 最大保留几天的日志,比如30天,就写30;不写就能永久保存 -->
<!--<maxHistory>30</maxHistory> -->
<!--每个日志最大容量 500MB;如果超过就会拆分 -->
<MaxFileSize>500MB</MaxFileSize>
</rollingPolicy>
<encoder>
<!--日志输出格式 -->
<pattern>${log.pattern}</pattern>
</encoder>
<!--过滤格式,只要debug以上的日志 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<!-- file_error 输出格式,写日志文件用 -->
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--<maxHistory>30</maxHistory> -->
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤格式,当是ERROR级别的日志时;注意只有ERROR,是等于 -->
<level>ERROR</level>
<!-- 是ERROR,就接受,可以打印到文件 -->
<onMatch>ACCEPT</onMatch>
<!-- 不是ERROR,就拒绝,不打印到文件 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 当代码是这个包里时,获取DEBUG以上的日志 -->
<logger name="com.my.project" level="DEBUG">
<!-- 这个不要开,开了就重复了 -->
<!--<appender-ref ref="file_info"/>-->
</logger>
<!-- 默认整个项目,只获取info级别以上的日志;按下面3个格式输出 -->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
</configuration>
说明:
1.首先可以看<root
部分,这个只获取整个项目info级别以上的日志,获取到后,按3个<appender
输出。
2.console
是<appender name="console"
,这个使用的类,就是输出到控制台用的,所以info日志就会打印到控制台。
3.file_info
是<appender name="file_info"
,这个使用的类,就是输出到文件里用的,所以info日志可以打印到文件;其中用到了过滤类ThresholdFilter
,注意写的是DEBUG
,不只是info以上的、debug日志也可以打印到文件。
4.file_error
是<appender name="file_error"
,类似,但是这个用的过滤类是LevelFilter
,设置了只要ERROR
日志,因此当info日志用这个打印时、按照过滤器、最终只打印ERROR
日志到文件里,便于区分。
5.最后,配置了<logger name="com.my.project" level="DEBUG">
,这个表示需要com.my.project
包里的debug以上的日志;
因为mybatis打印sql语句的日志级别是debug,所以配置了这个、才能获取到;
如果只配置com.my.project.dao
也可以,这个路径换成自己的mapper.java
接口所在的包;表示需要这个包里的日志级别为debug的日志;(这里偷懒就全配置成debug了,项目里多余的debug也会打印出来)
这里不需要写 <!--<appender-ref ref="file_info"/>-->
,会打印重复;应该是也会走<root level="info">
这里,然后到<appender-ref ref="console"/>
,可以把debug打印到控制台;也会到<appender-ref ref="file_info" />
,可以把debug打印到日志文件。
四、效果
1.经过测试,mybatis的sql语句成功打印到控制台与日志文件sys-info.log
了(框架确实是debug级别打的日志):
13:45:23.124 [http-nio-9999-exec-2] DEBUG c.g.m.d.L.findUserByUserName - [debug,159] - ==> Preparing: select user_name as username,password, 'admin' as role from sys_user where user_name=?
13:45:23.135 [http-nio-9999-exec-2] DEBUG c.g.m.d.L.findUserByUserName - [debug,159] - ==> Parameters: test(String)
13:45:23.151 [http-nio-9999-exec-2] DEBUG c.g.m.d.L.findUserByUserName - [debug,159] - <== Total: 1
2.上面配置的,日志打印后的日志文件格式如下:
sys-info.2025-03-20.4.log
sys-info.2025-03-20.5.log
sys-info.2025-03-21.0.log
sys-info.2025-03-21.1.log
sys-info.2025-03-21.2.log
sys-info.log
可以看到:
日志按天分割了,一天一组;
每天日志按大小分割,从.0.log
开始,超过500MB就会分为新日志,变为.1.log
,以此类推;
最新的日志就是原本的名字,sys-info.log
,超过500MB或者第二天后、才会修改日志名字。