一、前言

  使用log4jdbc在不改变原有代码的情况下,就可以收集执行的SQL文和JDBC执行情况。

  平时开发使用的ibatis,hibernate,spring jdbc的sql日志信息,有一点个缺点是占位符与参数是分开打印的,如果想要拷贝sql至PLSQL Developer客户端直接执行,需要自己拼凑sql。而log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,方便直接拷贝sql在PLSQL Developer等客户端直接执行,加快调试速度。

二、环境说明

Maven:3.5.2(点击下载) ,下载页

Tomcat:8.5.29(点击下载) ,下载页

JDK:jdk1.7.0_80(点击下载) ,下载页

MavenDependency:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.10.Final</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.5.0</version>
</dependency>
<!-- 日志 START -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>com.googlecode.log4jdbc</groupId>
<artifactId>log4jdbc</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<exclusions>
<!--排除jdmk、jms的依赖引入-->
<exclusion>
<artifactId>jmxtools</artifactId>
<groupId>com.sun.jdmk</groupId>
</exclusion>
<exclusion>
<artifactId>jms</artifactId>
<groupId>javax.jms</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 日志 END -->

三、log4jdbc的使用

1. 配置 log4j 的 src/main/resources/log4j.properties 的配置文件,如下所示:

#日志种类,参考链接 http://blog.csdn.net/dr_guo/article/details/50718063
#level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL
#线上配置需要关闭console控制台输出,否则tomcat的catalina.out文件会过大
#log4j.rootLogger=ALL,logDailyFile,logRollingFile
#开发配置需要开启console控制台输出
log4j.rootLogger=ALL,console,logDailyFile,logRollingFile #输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern=%d -%m%n
log4j.appender.console.layout.ConversionPattern=[%-22d{yyyy-MM-dd HH:mm:ssS} | %p | %t | %l]: %n%m%n%n
#DEBUG,INFO,WARN,ERROR
log4j.appender.console.Threshold=DEBUG
#默认值是true,所有的消息都会被立即输出
log4j.appender.console.ImmediateFlush=TRUE #DBlog, http://blog.csdn.net/u011686226/article/details/68932890
#以上日志种类都可以设置为 DEBUG , INFO 或 ERROR 级别。当设置为 FATAL 或 OFF 时,意味关闭记录。
#以下是一个采用 Log4j 作为具体日志系统的典型配置,将这些配置到 log4j.properties 里面:
#
#仅打印出执行 SQL
log4j.logger.jdbc.sqlonly=DEBUG,sql,console
#log4j.logger.jdbc.sqlonly=DEBUG,sql
#打印出执行 SQL 以及耗时信息
log4j.logger.jdbc.sqltiming=OFF,sqltiming,console
#打印出执行sql和结果集
log4j.logger.jdbc.resultsettable=OFF,console
#记录连接打开、关闭等信息,有利于调试数据库连接相关问题
log4j.logger.jdbc.connection=OFF,connection
#会产生更多的记录信息,因为记录了 ResultSet 的信息
log4j.logger.jdbc.resultset=OFF,jdbc
#记录除了 ResultSet 之外的所有 JDBC 调用信息,会产生大量的记录,有利于调试跟踪具体的 JDBC 问题
log4j.logger.jdbc.audit=OFF,jdbc #the appender used for the JDBC API layer call logging above, sql only
log4j.appender.sql=org.apache.log4j.FileAppender
log4j.appender.sql.Append=true
log4j.appender.sql.layout=org.apache.log4j.PatternLayout
log4j.appender.sql.File=/home/server/tomcat8/xxx_server/logs/sql/sql.log
log4j.appender.sql.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n #the appender used for the JDBC API layer call logging above, sql timing
log4j.appender.sqltiming=org.apache.log4j.FileAppender
log4j.appender.sqltiming.File=/home/server/tomcat8/xxx_server/logs/sql/sqltiming.log
log4j.appender.sqltiming.Append=true
log4j.appender.sqltiming.layout=org.apache.log4j.PatternLayout
log4j.appender.sqltiming.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n #the appender used for the JDBC API layer call logging above
log4j.appender.jdbc=org.apache.log4j.FileAppender
log4j.appender.jdbc.File=/home/server/tomcat8/xxx_server/logs/sql/jdbc.log
log4j.appender.jdbc.Append=true
log4j.appender.jdbc.layout=org.apache.log4j.PatternLayout
log4j.appender.jdbc.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n #the appender used for the JDBC Connection open and close events
log4j.appender.connection=org.apache.log4j.FileAppender
log4j.appender.connection.File=/home/server/tomcat8/xxx_server/logs/sql/connection.log
log4j.appender.connection.Append=true
log4j.appender.connection.layout=org.apache.log4j.PatternLayout
log4j.appender.connection.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n

2. 配置 src/main/resources/log4jdbc.properties 文件,可省略配置,不配置该文件,会使用默认值

#log4jdbc.debug.stack.prefix=
#log4jdbc.debug.stack.prefiis=
#log4jdbc.sqltiming.warn.threshold=
#log4jdbc.sqltiming.error.threshold=
log4jdbc.dump.booleanastruefalse=false
log4jdbc.dump.sql.maxlinelength=90
log4jdbc.dump.fulldebugstacktrace=false
log4jdbc.statement.warn=false
log4jdbc.dump.sql.select=true
log4jdbc.dump.sql.insert=true
log4jdbc.dump.sql.update=true
log4jdbc.dump.sql.delete=true
log4jdbc.dump.sql.create=true
log4jdbc.dump.sql.addsemicolon=false
log4jdbc.auto.load.popular.drivers=true
log4jdbc.trim.sql=true
log4jdbc.trim.sql.extrablanklines=true
log4jdbc.suppress.generated.keys.exception=false
#log4jdbc.drivers

3. 修改 dbconfig.properties 配置文件的 url 和 driverClassName

#url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
#driverClassName:com.mysql.jdbc.Driver url:jdbc:log4jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
driverClassName:net.sf.log4jdbc.DriverSpy

经过这样的配置之后,就可以使用 log4jdbc 记录应用系统执行的SQL信息了。

PS:

https://www.cnblogs.com/xdp-gacl/p/4081848.html

https://www.cnblogs.com/cnjavahome/p/8421846.html

http://blog.csdn.net/u011686226/article/details/68932890

Servlet开发 中使用 log4jdbc 记录 hibernate 的 SQL信息的更多相关文章

  1. Servlet开发中注意的细节问题

    客户端访问服务器的时候是通过URL访问的,所以我们要想用浏览器访问我们的Servlet的时候,我们就需要将我们的Servlet映射到一个URL上(通过我们的web.xml文件中的<servler ...

  2. java 组件开发中的日志记录问题

    今天帮别人写封装几个url 请求,打成jar 包,可以以java接口的方式提供给外部访问. 遇到两个问题: 1. 是否把依赖的jar包也 打入 我要生成的jar包中,如果你不打入,别人直接调用接口会报 ...

  3. Log4j分级别保存日志到单个文件中,并记录IP和用户信息

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...

  4. javaweb学习总结二十二(servlet开发中常见的问题汇总)

    一:web应用的映射问题 通常我们从别人那里拷贝来的代码,自己会修改应用的名称,但是web映射的访问路径并没有修改,还是原来的映射. 解决方法: 工程右键--properties--myeclipse ...

  5. ()-servlet.xml中剥离出的hibernate.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 23 Pro/E二次开发中的问题记录

    0 引言 由于项目中涉及到Pro/E的二次开发技术,因此在边用边学的情况下,解决了不少问题,也积攒了不少问题.其中有些问题可能不是调个函数就能搞定的,得了解CAD底层的东西. 1 问题描述 (1)CA ...

  7. servlet开发中遇到的问题集合

    问题1: servlet插入数据库时中文会乱码. 解决方法:在数据库连接地址最后增加两个转码参数(?useUnicode=true&characterEncoding=utf8) url=jd ...

  8. Web(Jsp+ Servlet)开发中如何解决中文乱码问题

    1.中文乱码的成因 编码的字符集和解码的字符集不一致. 2.web开发过程中可能出现的乱码的位置及解决方案 ①request乱码 在向服务器传递数据时,所传递的中文有可能出现乱码. post请求(协议 ...

  9. 【目录】Java项目开发中的知识记录

    此篇文章为学习Java的目录,<a href="#"></>这种的是还没有写的文章.已经加a标签的是已经写完的.没写的文章急切需要的话可以直接留言,不是特别 ...

随机推荐

  1. 3ds max学习笔记(六)-- 基本操作(建模前奏)

    1.界面设置 在3ds Max的版本的界面中,默认是较深.若需要切换至较亮的界面,步骤: 执行“自定义”菜单,选择“加载自定义用户界面方案”从弹出的界面中选择样式文件,单击“打开”即可: 注:“amg ...

  2. 移动应用滑动屏幕方向判断解决方案,JS判断手势方向

    问题分类 滑动屏幕打开相应功能操作. 问题描述 1.用户手动滑动屏幕,根据滑动的方向,打开相应的功能(如:向上滑摇钱树经验明细,向下滑打开任务明细,向左滑打开聚宝盆物品查看等功能),滑动事件捕获问题. ...

  3. JSP(7)—EL和JSTL

    一.EL表达式: 1.简介:EL全称为Expression Language,原本是JSTL1.0为方便存储数据所定义的语言,当时只能在JSTL标签中 使用,到了JSTL2.0之后,EL已经成为正式纳 ...

  4. win32下使用相对exe文件的绝对路径资源

    在使用VC++进行开发时,如果按F5进行Debug时,当前相对资源是相对工程的vcxproj的文件夹目录,而直接双击运行exe时,资源是相对exe的文件夹目录.为了兼容这二者,最好使用绝对路径,这样无 ...

  5. java.lang.NumberFormatException: multiple points错误问题

    最近项目一直会出现时间转换报错,一直不知道是什么问题??? java.lang.NumberFormatException: multiple points     at sun.misc.Float ...

  6. Java程序猿怎样高速理解Kubernetes

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/82892167 https: ...

  7. CentOS7.2网络配置

    修改hostname vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain ...

  8. (原)Max Area of Island(即连通域标记)

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/10493114.html 1. 问题 Given a non-empty 2D array grid ...

  9. 【C++】C++中的函数

    目录结构: contents structure [-] 简介 可变形参的函数 initializer_list形参 省略符形参 main函数处理命令行选项 函数指针与函数引用 inline内联函数 ...

  10. What’s new for Spark SQL in Apache Spark 1.3(中英双语)

    文章标题 What’s new for Spark SQL in Apache Spark 1.3 作者介绍 Michael Armbrust 文章正文 The Apache Spark 1.3 re ...