在常规项目的开发中可能最容易出问题的地方就在于对数据库的处理了,在大部分的环境下,我们对数据库的操作都是使用流行的框架,比如 Hibernate 、 MyBatis 等。由于各种原因,我们有时会想知道在这些框架下实际执行的 SQL 究竟是什么。

虽然 Hibernate 可以在配置文件中打开 SHOW SQL 的功能, MyBatis 则可以在 Log4j 的配置文件中配置 SQL 语句的输出,但这些输出是类似这样的 INSERT … ? ? ? 语句,并不是一个完整可以运行的 SQL ,要想知道完整的 SQL 需要手动把参数补齐,如果要调试这样的 SQL 无疑非常痛苦。

Log4jdbc 是一个开源 SQL 日志框架,它使用代理模式实现对常用的 JDBC Driver( Oracle , Derby , MySQL , PostgreSQL , H2 , HSQLDB , …)操作的拦截,记录真实 SQL ,可以将占位符与参数全部合并在一起显示,方便直接拷贝 SQL 在 MySQL 等客户端直接执行,加快调试速度。本文主要介绍如何使用 Log4jdbc 这个可以直接显示完整 SQL 的日志框架,希望对大家能有所帮助。

Log4jdbc 的特点:

Log4jdbc 的官方主页是 https://github.com/arthurblake/log4jdbc ,它具有以下特点:

  • 完全支持 JDBC3 和 JDBC4

  • 配置简单,在大多数情况下,只需要将 JDBC 驱动类改成 net.sf.log4jdbc.DriverSpy ,同时将 jdbc:log4jdbc 添加到现有的 JDBC URL 之前,最后配置日志记录的种类即可

  • 将 Prepared Statements 中的绑定参数自动插入到对应的位置。在大多数情况下极大改善了可读性及调试工作

  • SQL 的耗时信息能被获取从而帮助判断哪些语句执行得过慢,同时这些信息可以被工具识别得到一个关于慢 SQL 的报表

  • SQL 连接信息也可以获取从而帮助诊断关于连接池或线程的问题

  • 兼容任何 JDBC 驱动,需要 JDK1.4 及以上与 Slf4j1.x

  • 开源软件,使用 Apache 2.0 License

使用 Log4jdbc 的步骤:

感兴趣的朋友可以去 Log4jdbc 的项目主页看它的使用方法,如果单纯使用 Log4jdbc ,不会对 ResultSet 以表格方式呈现,在这里我们使用扩展自 Log4jdbc 的日志框架 Log4jdbc-log4j2 ,它增加了对 ResultSet 以表格方式呈现的处理,项目主页是: https://code.google.com/p/log4jdbc-log4j2/ 。它的使用步骤如下:

1、决定使用哪个版本的 JAR 包:

如果使用 JDK1.5 , 应该使用 JDBC3 版本的 JAR 包即 log4jdbc-log4j2-jdbc3.jar 。

如果使用 JDK1.6 , 应该使用 JDBC4 版本的 JAR 包即 log4jdbc-log4j2-jdbc4.jar (即使实际使用的 JDBC 驱动是 JDBC3 的甚至更老)。

如果使用 JDK1.7 , 应该使用 JDBC4.1 版本的 JAR 包即 log4jdbc-log4j2-jdbc4.1.jar (即使实际使用的 JDBC 驱动是 JDBC3 的甚至更老)。

2、将 JAR 包添加进项目:

将 JAR 包添加进项目有两种方式,第一种是直接将 Log4jdbc-log4j2 和 Slf4j 的 JAR 包添加进 CLASSPATH 中,第二种是使用 MAVEN 方式引入 JAR 包,这里我们主要说明第二种方式。在 pom.xml 文件中,根据使用的 JDBC 驱动的版本来替换 log4jdbc-log4j2-jdbcXX (比如 log4jdbc-log4j2-jdbc4.1 , 或者 log4jdbc-log4j2-jdbc4 , 或者 log4jdbc-log4j2-jdbc3 )。该框架需要配合 Slf4j 一起使用,MAVEN 配置如下:

<dependency><groupId>org.bgee.log4jdbc-log4j2</groupId> <artifactId>log4jdbc-log4j2-jdbcXX</artifactId> <version>1.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency>

3、将项目的配置文件中的 JDBC 驱动类改成 net.sf.log4jdbc.sql.jdbcapi.DriverSpy 。

4、将 jdbc:log4 添加到现有的 JDBC URL 之前:

例如原来的 JDBC URL 是

 jdbc:mysql://localhost:3306/MyDatabase 

,则应该改成:

 jdbc:log4jdbc:mysql://localhost:3306/MyDatabase 

5、配置日志记录的种类:

Log4jdbc 用以下几个可以配置的日志种类:

  • jdbc.sqlonly : 仅记录 SQL

  • jdbc.sqltiming :记录 SQL 以及耗时信息

  • jdbc.audit :记录除了 ResultSet 之外的所有 JDBC 调用信息,会产生大量的记录,有利于调试跟踪具体的 JDBC 问题

  • jdbc.resultset :会产生更多的记录信息,因为记录了 ResultSet 的信息

  • jdbc.connection :记录连接打开、关闭等信息,有利于调试数据库连接相关问题

以上日志种类都可以设置为 DEBUG , INFO 或 ERROR 级别。当设置为 FATAL 或 OFF 时,意味关闭记录。

以下是一个采用 Log4j 作为具体日志系统的典型配置,将这些配置到 log4j.properties 里面:

log4j.logger.jdbc.sqlonly=OFF
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF

6、添加 log4jdbc.log4j2.properties 文件:

这是最后一步,在项目的 CLASSPATH 路径下创建一个 log4jdbc.log4j2.properties 文件,告诉 Log4jdbc-log4j2 使用的是 Slf4j 来记录和打印日志,在该配置文件里增加:

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

最后,运行一下项目,看看效果。

效果:

上图可以看出,两个 SELECT 语句的执行时间分别是 117 和 552 毫秒,这对于开发调试还是很有帮助的。现在很多项目的压测时和上线后,基本都在使用 OneAPM ,它的数据库监控分析功能更强大一些,不仅可以记录 SQL 日志,还可以定位到操作 SQL 的 Java 代码行,直接在网页上就可以看到效果,使用体验还是不错的。

http://www.cnblogs.com/oneapm/p/4828243.html

如何有效地记录 Java SQL 日志(转)相关推荐

  1. Web项目错误记录java.sql.SQLException: Incorrect integer value: ‘aa‘ for column ‘password‘

    这里先说遇到这错误的第一种情况,创建的实体类与映射对应项的值不匹配.举个例子,你数据库密码是整形,而你输入了字符型,输入的字符型数据封装到对象中去修改数据库的值时类型不匹配. 解决方法:修改数据库中对 ...

  2. NET问答: 如何记录 EntityFramework 中的所有 SQL 日志 ?

    咨询区 PC.: 我正在 MVC5 项目中使用 EF 6.0,为了方便调试和获取性能指标,我想记录 EF6 中的所有 sql  日志. 在 Java/Hibernate 中,我只需要设置 hibern ...

  3. Spring / Hibernate使用log4jdbc改进了SQL日志记录

    Hibernate提供了开箱即用的SQL日志记录,但是这种日志记录仅显示准备好的语句,而不显示发送到数据库的实际SQL查询. 它还不会记录每个查询的执行时间,这对于性能故障排除很有用. 这篇博客文章将 ...

  4. mybatis 开启日志记录 打印sql语句

    使用mybatis 的时候 ,无法查看sql 语句 !!非常不方便调试程序,所以 配置了日志记录输出sql  ,在控制台打印, 1.要配置mybatis 使用log4j 记录日志,  导入 log4j ...

  5. 记录druid整合springboot+logback配置打印sql日志

    [记录druid整合springboot+logback配置打印sql日志] 整合记录 整合记录 首先看 druid 的LogFilter 为我们准备的四种logger类型 这些logger分别对应打 ...

  6. EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录

    前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...

  7. (转)如何在MySql中记录SQL日志(例如Sql Server Profiler)

    SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用.例如:别人写的复杂代码.生产系统.无调试环境.无原代码... ... 查了一下资料, ...

  8. gorm 记录sql日志 每天一个日志文件

    数据库设置 package databaseimport ("fmt""log""sync""test/mylogger" ...

  9. java log日志函数_Java 中的 AWS Lambda 函数日志记录 - AWS Lambda

    AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. Ja ...

最新文章

  1. Python爬虫破解有道翻译
  2. 如何保留5个有效数字输出c不4舍5入_10 个C语言课设小项目拿走不谢~
  3. RealNetworks CTO:我们追求低复杂度的软解码
  4. 推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架
  5. 合作开发和委托开发完成成果的归属
  6. scala 字符串占位符_如何在Scala中将带有换行符的字符串转换为字符串列表?
  7. angular HttpClient getbyid 方法获取数据
  8. 群晖nas存储系统原理_群晖NAS入门教程第四节:群晖存储空间管理员功能和磁盘阵列类型的简介...
  9. 硬盘:主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR解析
  10. 消息中间件----ActiveMQ
  11. STM32模拟I2C程序
  12. 1.1二进制文件概述
  13. iOS 开发者账号持有人转让最新方式
  14. 史上最全的用Python操控手机APP攻略!建议收藏!
  15. 共振峰估计2MATLAB
  16. Java程序设计 多线程 基础知识题
  17. 成为一名CV(计算机视觉)工程师,你需要具备哪些能力?
  18. 第八部份:Bless安装
  19. FlexRay™ 协议控制器 (E-Ray)-03
  20. 模拟输出质点轨迹坐标

热门文章

  1. c语言:一个C文件可否调用另一个c文件中的函数
  2. centos6 安装 mantisbt-1.2.8 —— (1) VMware Workstation 12 Pro 虚拟机安装步骤详解(window 10 系统)
  3. Dom4J的基本使用
  4. 使用云服务器安装QEMU搭建嵌入式开发环境
  5. Hadoop- MapReduce分布式计算框架原理
  6. BZOJ4129: Haruna’s Breakfast
  7. Struts 2+Spring 3+Hibernate 3.3 在MyEclipse 10环境下的整合配置
  8. 1244. Gentlemen
  9. 一篇文章告诉你:荣耀10 GT为什么叫全能旗舰
  10. python hash