SQL/日志监控框架log4jdbc

系列文章目录



前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


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信息

  • 35
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java毕设王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值