springboot下mybatis-plus如何打印sql日志和参数到日志文件

作者:Joker2018 时间:2023-06-15 12:34:05 

最近在使用springboot过程中用到了mybatis-plus ,springboot版本是2.3.1.RELEASE,mybatis-plus 版本3.2.0。

<dependency>
           <groupId>com.baomidou</groupId>
           <artifactId>mybatis-plus-boot-starter</artifactId>
           <version>3.2.0</version>
       </dependency>

使用中需要打印sql日志和参数,网上很多的做法是增加日志输出配置。

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

加上去后日志确实是出来,可以看到idea控制台上将sql和参数打印出来了。

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@15b67b] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@6761653 wrapping oracle.jdbc.driver.T4CConnection@1ea226b] will not be managed by Spring
JsqlParserCountOptimize sql=SELECT id,password,address,phone,name,email FROM T_USER_TEST3  WHERE name = ?
==>  Preparing: SELECT COUNT(1) FROM T_USER_TEST3 WHERE name = ?
==> Parameters: zhangsan3(String)
<==    Columns: COUNT(1)
<==        Row: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@15b67b]

但是项目打成jar包运行后,日志文件上并没有把sql日志记录下来,查看 spring.log文件只看到初始启动日志。

2021-07-22 16:43:26.429  INFO 35468 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '/test'
2021-07-22 16:43:26.456  INFO 35468 --- [main] c.dragonsoft.demojar.DemoJarApplication  : Started DemoJarApplication in 21.168 seconds (JVM running for 22.947)
2021-07-22 16:43:45.047  INFO 35468 --- [http-nio-8080-exec-7] o.a.c.c.C.[Tomcat].[localhost].[/test]   : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-07-22 16:43:45.047  INFO 35468 --- [http-nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-07-22 16:43:45.062  INFO 35468 --- [http-nio-8080-exec-7] o.s.web.servlet.DispatcherServlet        : Completed initialization in 14 ms

其实StdOutImpl只是把日志打印到控制台,看下StdOutImpl的源码所在的包,是用System.out.println打印的日志,显然这个是把日志打印到控制台,并不会存到日志文件。

springboot下mybatis-plus如何打印sql日志和参数到日志文件

我们知道springboot默认使用的是logback日志组件,mybatis-plus同时提供了slf4j的日志实现,这个正是我们要用的。

springboot下mybatis-plus如何打印sql日志和参数到日志文件

 修改日志输出方式为slf4j,

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

重启再试,日志依然没打印出来,这次连控制台也没有输出sql日志。

通过刚才的日志,我们看到打印sql的实现类是JsqlParserCountOptimize。

JsqlParserCountOptimize sql=SELECT id,password,address,phone,name,email FROM T_USER_TEST3 WHERE name = ?

跟踪JsqlParserCountOptimize的代码发现,打印日志前有一个判断logger.isDebugEnabled(),

springboot下mybatis-plus如何打印sql日志和参数到日志文件

StdOutImpl默认是返回true;

springboot下mybatis-plus如何打印sql日志和参数到日志文件

而slf4j,由于没有指定debug日志级别导致日志没有输出,

springboot下mybatis-plus如何打印sql日志和参数到日志文件

 指定mybatisplus包名下的日志级别为debug。

logging.level.com.baomidou.mybatisplus=DEBUG

重启后再试发现日志成功打印出来了,

 控制台:

2021-07-22 17:29:52.621  INFO 38796 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '/test'
2021-07-22 17:29:52.642  INFO 38796 --- [           main] c.dragonsoft.demojar.DemoJarApplication  : Started DemoJarApplication in 23.164 seconds (JVM running for 24.643)
2021-07-22 17:29:58.715  INFO 38796 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/test]   : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-07-22 17:29:58.716  INFO 38796 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-07-22 17:29:58.737  INFO 38796 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 21 ms
2021-07-22 17:30:44.025  WARN 38796 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=1m521ms831µs400ns).
2021-07-22 17:30:45.131 DEBUG 38796 --- [nio-8080-exec-1] c.b.m.e.p.p.o.JsqlParserCountOptimize    : JsqlParserCountOptimize sql=SELECT id,password,address,phone,name,email FROM T_USER_TEST3  WHERE name = ?

 日志文件:

2021-07-22 17:29:52.621  INFO 38796 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '/test'
2021-07-22 17:29:52.642  INFO 38796 --- [main] c.dragonsoft.demojar.DemoJarApplication  : Started DemoJarApplication in 23.164 seconds (JVM running for 24.643)
2021-07-22 17:29:58.715  INFO 38796 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/test]   : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-07-22 17:29:58.716  INFO 38796 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-07-22 17:29:58.737  INFO 38796 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 21 ms
2021-07-22 17:30:44.025  WARN 38796 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=1m521ms831µs400ns).
2021-07-22 17:30:45.131 DEBUG 38796 --- [http-nio-8080-exec-1] c.b.m.e.p.p.o.JsqlParserCountOptimize    : JsqlParserCountOptimize sql=SELECT id,password,address,phone,name,email FROM T_USER_TEST3  WHERE name = ?

但是只是打印了sql,参数呢?通过阅读源码发现参数打印是由logging目录下的这几个类实现的;

springboot下mybatis-plus如何打印sql日志和参数到日志文件

具体实现是通过 * 的方式,

springboot下mybatis-plus如何打印sql日志和参数到日志文件

代理的初始化是在org.apache.ibatis.executor.BaseExecutor类进行,可以发现同样有一个debug判断,

springboot下mybatis-plus如何打印sql日志和参数到日志文件

springboot下mybatis-plus如何打印sql日志和参数到日志文件

查看log实现类,发现项目模块mapper目录没有指定日志级别

springboot下mybatis-plus如何打印sql日志和参数到日志文件

 修改项目mapper目录日志级别为debug后发现sql日志和参数成功打印。

logging.level.com.dragonsoft.demojar.mapper=DEBUG

控制台:

2021-07-22 17:46:29.255  INFO 38688 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-07-22 17:46:29.268  INFO 38688 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : Completed initialization in 13 ms
2021-07-22 17:46:36.869 DEBUG 38688 --- [nio-8080-exec-6] c.b.m.e.p.p.o.JsqlParserCountOptimize    : JsqlParserCountOptimize sql=SELECT id,password,address,phone,name,email FROM T_USER_TEST3  WHERE name = ?
2021-07-22 17:46:36.906 DEBUG 38688 --- [nio-8080-exec-6] c.d.d.m.U.pagingBySearchable             : ==>  Preparing: SELECT COUNT(1) FROM T_USER_TEST3 WHERE name = ?
2021-07-22 17:46:36.998 DEBUG 38688 --- [nio-8080-exec-6] c.d.d.m.U.pagingBySearchable             : ==> Parameters: zhangsan3(String)

日志文件:

2021-07-22 17:46:29.254  INFO 38688 --- [http-nio-8080-exec-6] o.a.c.c.C.[Tomcat].[localhost].[/test]   : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-07-22 17:46:29.255  INFO 38688 --- [http-nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-07-22 17:46:29.268  INFO 38688 --- [http-nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : Completed initialization in 13 ms
2021-07-22 17:46:36.869 DEBUG 38688 --- [http-nio-8080-exec-6] c.b.m.e.p.p.o.JsqlParserCountOptimize    : JsqlParserCountOptimize sql=SELECT id,password,address,phone,name,email FROM T_USER_TEST3  WHERE name = ?
2021-07-22 17:46:36.906 DEBUG 38688 --- [http-nio-8080-exec-6] c.d.d.m.U.pagingBySearchable             : ==>  Preparing: SELECT COUNT(1) FROM T_USER_TEST3 WHERE name = ?
2021-07-22 17:46:36.998 DEBUG 38688 --- [http-nio-8080-exec-6] c.d.d.m.U.pagingBySearchable             : ==> Parameters: zhangsan3(String)

总结:总共需要以下三个配置

1:设置mybatisplus包下的日志级别为DEBUG;
2:设置项目mapper目录的日志级别为DEBUG;
3:设置mybatis-plus的日志输出方式为slf4j。

logging.level.com.baomidou.mybatisplus=DEBUG
#项目mapper目录
logging.level.com.dragonsoft.demojar.mapper=DEBUG
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

当然,生产环境下还是需要谨慎考虑一下是否开启sql日志,因为日志记录是会进行频繁的IO,会有一定的性能损耗。

来源:https://blog.csdn.net/qq_36407469/article/details/119003229

标签:mybatis-plus,打印sql日志,参数到日志
0
投稿

猜你喜欢

  • Java实现用户管理系统

    2023-08-26 17:18:21
  • C# 分支与循环介绍

    2022-10-26 13:50:02
  • C#实现让ListBox适应最大Item宽度的方法

    2022-06-30 16:41:26
  • Java将json对象转换为map键值对案例详解

    2023-11-28 07:38:43
  • 详解如何在Java中加密和解密zip文件

    2022-12-07 12:26:46
  • Springboot笔记之热部署及不生效的解决方案

    2023-11-03 02:40:00
  • Struts2学习教程之拦截器机制与自定义拦截器

    2021-10-27 13:02:56
  • SpringCloud OpenFeign超详细讲解模板化远程通信的实现

    2023-04-27 06:43:29
  • Kotlin协程Channel特点及使用细节详解

    2021-06-03 08:12:34
  • linux下C语言中的mkdir函数与rmdir函数

    2023-07-07 14:16:16
  • Java中的length和length()深入分析

    2022-01-23 06:33:01
  • 遍历文件系统目录树的深入理解

    2022-09-15 20:03:46
  • Spring spel表达式使用方法示例

    2023-08-25 00:43:32
  • C#获取本地IP的四种方式示例详解

    2023-04-16 00:52:50
  • python只需30行代码就能记录键盘的一举一动

    2023-06-27 18:22:12
  • Android超实用的Toast提示框优化分享

    2022-12-20 08:36:32
  • java 实现将Object类型转换为int类型

    2023-11-11 07:58:03
  • Maven 配置文件 生命周期 常用命令详解

    2022-07-05 19:59:39
  • Android性能优化及性能优化工具

    2023-11-12 09:24:00
  • c#使用file.copy实现文件备份示例

    2021-06-03 05:13:13
  • asp之家 软件编程 m.aspxhome.com