系列文章目录
文章目录
- 系列文章目录
- 前言
前言
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
log4jdbc is a Java JDBC driver that can log SQL and/or JDBC calls (and optionally SQL timing information) for other JDBC drivers using the Simple Logging Facade For Java (SLF4J) logging system.
新入手一个项目,想要了解其业务逻辑,看其SQL是必不可少的,但是为了更明了的学习,我们往往需要把SQL拿出来,调试和验证。
在SpringBoot集成MyBatis中,如果想要打印SQL,很简单:
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
但是这里打印的SQL,你传递的参数是以?来代替的,因为MyBatis使用的是占位符,不是拼接SQL,那么如何把具体执行的SQL打印出来?
有人说用P6Spy,但实际上这个框架和MyBatis自己打印SQL功能是一样的,不能满足上诉需求。
又看到一个log4jdbc,使用后可以满足要求。当然不止这个框架打印执行SQL这种东西,是不能上生产的,这里只是为了本地使用。
首先引入
<!--监控sql日志-->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
新增 log4jdbc.log4j2.properties 配置文件:
# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
配置详细介绍
log4jdbc.spylogdelegator.name spy日志处理类,默认为 net.sf.log4jdbc.log4j2.Log4j2SpyLogDelegator
log4jdbc.debug.stack.prefix 项目应用程序的包的部分或全部的前缀
log4jdbc.sqltiming.warn.threshold 执行SQL的时间长度(毫秒),在该时间段内,SQL需要至少运行这么长时间才能生成警告消息
log4jdbc.sqltiming.error.threshold 执行SQL的时间长度(毫秒),在该时间段内,SQL需要至少运行这么长时间才能生成错误消息
log4jdbc.dump.booleanastruefalse boolean 值显示为 0 和 1 ,为 true 时 boolean 值显示为 true 和 false,默认false
log4jdbc.dump.sql.maxlinelength SQL显示的最大长度,默认90
log4jdbc.dump.fulldebugstacktrace 在调试模式下是否转储完整堆栈跟踪,默认false
log4jdbc.statement.warn 使用statement(不是PreparedStatement)时,在日志中是否与SQL一起显示警告,默认false
log4jdbc.dump.sql.select select语句是否输出,默认true
log4jdbc.dump.sql.insert insert语句是否输出,默认true
log4jdbc.dump.sql.update update语句是否输出,默认true
log4jdbc.dump.sql.delete delete语句是否输出,默认true
log4jdbc.dump.sql.create create语句是否输出,默认true
log4jdbc.dump.sql.addsemicolon 是否在 SQL 的行末添加一个分号,默认false
log4jdbc.auto.load.popular.drivers 是否自动选择最佳jdbc驱动,默认true
log4jdbc.drivers jdbc驱动,String类型
log4jdbc.trim.sql 默认true
log4jdbc.trim.sql.extrablanklines 默认true
log4jdbc.suppress.generated.keys.exception 默认false
在application.yml文件里修改数据库相关配置,替换Driver和URL
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
# driverClassName: com.mysql.jdbc.Driver
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
druid:
master:
# url: jdbc:mysql://106.14.119.120:3306/test
url: jdbc:log4jdbc:mysql://106.14.119.120:3306/test
配置log4jdbc的日志打印,不配置的话,日志量特别大
log4jdbc 中使用了以下 7 种logger,可以进行相应的配置来实现需求
logger 描述
jdbc.sqlonly 仅仅记录 SQL 语句,会将占位符?替换为实际的参数
jdbc.sqltiming 记录 SQL 语句实际的执行时间
jdbc.audit 除了 ResultSet 之外的所有JDBC调用信息,篇幅较长
jdbc.resultset 包含 ResultSet 的信息,输出篇幅较长
jdbc.connection 输出了 Connection 的 open、close 等信息
log4jdbc.debug 内部调试使用,输出 log4jdbc spy 加载驱动时的信息
jdbc.resultsettable 显示前滚结果集的记录器
这里我们只看SQL即可,可以根据你使用的框架,增加类似配置
<!--监控sql日志输出 -->
<!-- 仅仅记录 SQL 语句,会将占位符替换为实际的参数-->
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<appender-ref ref="Console" />
</logger>
<!-- 包含 ResultSet 的信息,输出篇幅较长 -->
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="Console" />
</logger>
<!-- 如想看到表格数据,将OFF改为INFO -->
<logger name="jdbc.resultsettable" level="OFF" additivity="false">
<appender-ref ref="Console" />
</logger>
<!-- 输出了 Connection 的 open、close 等信息 -->
<logger name="jdbc.connection" level="OFF" additivity="false">
<appender-ref ref="Console" />
</logger>
<!-- 包含 SQL 语句实际的执行时间 及sql语句(与jdbc.sqlonly功能重复) -->
<logger name="jdbc.sqltiming" level="OFF" additivity="false">
<appender-ref ref="Console" />
</logger>
<!-- 除了 ResultSet 之外的所有JDBC调用信息,篇幅较长 -->
<logger name="jdbc.audit" level="OFF" additivity="false">
<appender-ref ref="Console" />
</logger>
运行程序,即可看到我们想要的SQL信息