java配置mybatis打印日志

一、概述

最近想让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或者第二天后、才会修改日志名字。

Java SpringBoot项目中,如果使用了Mybatis框架,默认情况下执行的所有SQL操作都不会打印日志。但是有时候我们需要对一些错误的语句进行排查,这时候就需要配置打印SQL日志。有两种常见的配置方法可以实现这个目的。 第一种方法是在application.properties文件中添加如下配置: ``` mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` 但是有些情况下这种配置可能不起作用。 第二种方法是在application.yml文件中添加如下配置: ``` logging: level: com.xxx.webapp.dao: DEBUG ``` 其中`com.xxx.webapp.dao`是你的DAO接口包的层级目录,根据你的项目实际情况进行配置。这样配置后,Mybatis打印SQL日志。 另外,你也可以通过编程方式配置打印SQL语句。例如,在Mybatis配置类中添加如下代码: ```java MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true); configuration.setCacheEnabled(false); configuration.setLogImpl(StdOutImpl.class); bean.setConfiguration(configuration); ``` 这样配置后,Mybatis也会打印SQL日志。 #### 引用[.reference_title] - *1* [SpringBoot+Mybatis打印sql语句](https://blog.youkuaiyun.com/qq_46086108/article/details/121698059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [springboot+mybatis项目sql日志打印配置](https://blog.youkuaiyun.com/egegerhn/article/details/124036337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [springboot+mybatis-plus 两种方式打印sql语句](https://blog.youkuaiyun.com/snlx258/article/details/117225671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐梦想永不停

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值