网站首页
Java
站长
开源
框架
理论
JS
Linux
DB
服务器
NET
生活
软件
PHP
其他
您的位置:首页 > 开源 > SQL/日志监控框架log4jdbc
SQL/日志监控框架log4jdbc
2023-3-17    1408    1

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.


log4j.jpg


新入手一个项目,想要了解其业务逻辑,看其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信息


上一篇: 使用Redis位图实现12306分段购票
下一篇: Windows下如何查看端口被谁占用
评论列表:
Java小强
2023-05-06 09:23 回复

上诉需要大量配置,有时造成不必要的麻烦,因此建议采用IDEA插件来实现:https://plugins.jetbrains.com/plugin/17898-mybatis-log-free

发表评论:
您的网名:
个人主页:
编辑内容: