一、前言
使用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