前言
无论使用原生JDBC、mybatis还是hibernate,使用log4j等日志框架可以看到生成的SQL,但是占位符和参数总是分开打印的,不便于分析,显示如下的效果:
Log4jdbc 是一个开源 SQL 日志框架,它使用代理模式实现对常用的 JDBC Driver( Oracle , Derby , MySQL , PostgreSQL , H2 ,等)操作的拦截,记录真实 SQL ,可以将占位符与参数全部合并在一起显示,方便直接拷贝 SQL 在 MySQL 等客户端直接执行,加快调试速度。
版本
- springboot
2.6.3 - spring-cloud-starter-alibaba
2021.0.1.0 - mybatis-plus-boot-starter
3.4.3.4 - 数据库驱动
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
添加log4jdbc依赖
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
<scope>runtime</scope>
</dependency>
添加log4jdbc.log4j2.properties文件
# 指定驱动
log4jdbc.drivers=oracle.jdbc.OracleDriver
#毫秒值.执行时间超过该值的SQL语句将被记录为warn级别
log4jdbc.sqltiming.warn.threshold=2000
#毫秒值.执行时间超过该值的SQL语句将被记录为error级别
log4jdbc.sqltiming.error.threshold=3000
#修剪已记录的SOL
log4jdbc.trim.sql=true
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
# 禁止自动加载最常用驱动
log4jdbc.auto.load.popular.drivers=false
替换jdbc驱动
logback-spring.xml设置log4jdbc日志输出级别
<!-- 慢sql耗时log begin-->
<logger name="jdbc.connection" level="OFF"/>
<logger name="jdbc.resultset" level="OFF"/>
<logger name="jdbc.resultsettable" level="OFF"/>
<logger name="jdbc.audit" level="OFF"/>
<logger name="jdbc.sqltiming" level="WARN"/>
<logger name="jdbc.sqlonly" level="OFF"/>
<!-- 慢sql耗时log end-->
<springProfile name="local">
<!-- 慢sql耗时log,local环境调低级别 -->
<logger name="jdbc.sqltiming" level="INFO"/>
<logger name="jdbc.resultsettable" level="INFO"/>
<root level="DEBUG">
<appender-ref ref="console" />
<appender-ref ref="async"/>
</root>
</springProfile>
去除mybatis-plus sql控制台输出
效果图
从效果图可以看到,log出的sql是完整的,不会像mybatis sql包含占位符,参数与sql分别输出的情况,这样非常便于我们进行sql分析。