欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jfinal中使用日志框架输出完整sql语句信息

程序员文章站 2022-07-14 08:55:27
...

该博客转至:http://www.jfinal.com/share/324 还有logback方式进行输出

我对 log4j jdbc日志配置做了一些修改和注释便于大家理解 防止不必要的信息在控制台输出

在开发过程中,我们希望控制台输出一些比较有价值的信息,JFinal开启调试模式以后,可以显示如下信息,这是极好的。

  1. JFinal action report -------- 2017-06-19 19:58:05 ------------------------------
  2. Url         : GET /sys/terminal/getListData
  3. Controller  : cn.ablefly.controller.sys.TerminalController.(TerminalController.java:1)
  4. Method      : getListData
  5. Interceptor : cn.ablefly.core.auth.interceptor.SysLogInterceptor.(SysLogInterceptor.java:1)
  6.               cn.ablefly.core.auth.interceptor.AuthorityInterceptor.(AuthorityInterceptor.java:1)
  7. Parameter   : sord=asc  page=1  nd=1497873485305  sidx=  rows=10  _search=false

可惜的是,在显示sql语句方面,自带的调试输出效果就比较一般了,只会简单的显示出输出的sql语句,占位符也是用?号代替的。需要开启下面的注释掉的第二行代码

  1. ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
  2. //arp.setShowSql(true);
  3. //arp.setDevMode(true);

显示效果如下:

  1. Sql: select * from `evnet_terminal` where `id` = ?

显然,这种简陋的显示对我们调试复杂的sql语句和排错是没有太多价值的。那么我们就来动手改造一下吧!改造之后,我们的显示效果应该是这个样子的!完整的显示了执行的sql,占位符也被实际参数更换,更显示出了sql执行所花费的时间。

  1. 20:08:45.903 [qtp1803817267-27] DEBUG jdbc.sqltiming -  com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:2714)
  2. 10. select * from `evnet_terminal` where `id` = 14 
  3.  {executed in 0 msec}

1、确定所需要的jar包依赖。

不同项目所用的日志框架可能有所不同,所以项目中和日志有关的jar包也不尽相同,这里我只列出我发现的两种情况。

首先,必须引入的jar包包括如下三个:

  1. <dependency>
  2. <groupId>log4j</groupId>
  3. <artifactId>log4j</artifactId>
  4. <version>1.2.16</version>
  5. </dependency>
  6. <dependency>
  7.   <groupId>org.slf4j</groupId>
  8.   <artifactId>slf4j-api</artifactId>
  9.   <version>1.7.7</version>
  10. </dependency>
  11. <dependency>
  12.   <groupId>com.googlecode.log4jdbc</groupId>
  13.   <artifactId>log4jdbc</artifactId>
  14.   <version>1.2</version>
  15. </dependency>

其中真正帮助我们显示完整sql数据的jar是log4jdbc-1.2.jar,该框架的详细介绍如下:

https://github.com/arthurblake/log4jdbc/blob/wiki/ProjectHome.md

 

还有一个jar包依赖,需要2选1,如果你的项目中已经引入了其中任何一个,就不需要再引入另一个了。2选1的jar包如下:

  1. <dependency>
  2.    <groupId>org.slf4j</groupId>
  3.    <artifactId>log4j-over-slf4j</artifactId>
  4.    <version>1.7.7</version>
  5. </dependency>
  6.  
  7. <dependency>
  8.    <groupId>org.slf4j</groupId>
  9.    <artifactId>slf4j-log4j12</artifactId>
  10.    <version>1.7.7</version>
  11. </dependency>

jar包的版本不是必须使用1.7.7的,其他版本也可以尝试。同时引入以上两个包会产生堆栈溢出问题,详情可参考这篇文档:

http://blog.csdn.net/kxcfzyk/article/details/38613861

2、修改数据库配置信息中的jdbcUrl配置和driverClass配置,示例如下:

  1. jdbcUrl = jdbc:log4jdbc:mysql://localhost:3306/evnet?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
  2.  
  3. driverClass=net.sf.log4jdbc.DriverSpy

注意,jdbcUrl中的"jdbc:"与":mysql"之间的"log4jdbc"就是我们对url的改变之处,其他的数据库描述符的配置,也是一样的思路,在适当的位置加上"log4jdbc"即可。而driverClass的配置是固定的。

3、修改Jfinal核心配置类,用包含四个参数的构造函数配置数据库连接池。

在大部分情况下,我们在项目的核心配置类中,配置连接池,不管是c3p0还是druid或者使用其他的连接池,我们都会用三个参数的构造方法,如下示例为建立一个druid连接池的封装方法:

  1. public static DruidPlugin createDruidPlugin() {
  2.    DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password"));
  3.    dp.addFilter(new StatFilter());
  4.    dp.addFilter(new Slf4jLogFilter());
  5.    WallFilter wall = new WallFilter();
  6.    wall.setDbType("mysql");
  7.    dp.addFilter(wall);
  8.    return dp;
  9. }

我们只需要将这一行关键代码

  1. DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password"));

后面多加一个参数,即可指定所使用的driverClass,即代码改成

  1. DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password"),PropKit.get("driverClass"));

4、修改log4j.properties日志输出配置文件的主要配置如下:

log4j.rootLogger=INFO, stdout, file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n
# Output to the File
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender  
log4j.appender.Threshold = DEBUG
log4j.appender.file.DatePattern = '.'yyyy-MM-dd
log4j.appender.file.File=logs/log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%n%-d{yyyy-MM-dd HH:mm:ss}%n[%p]-[Thread: %t]-[%C.%M()]: %m%n

 

5、使用log4j.properties:我们需要在log4j.properties后面增加log4j jdbc日志配置

#记录除ResultSet调用以外的所有JDBC调用
log4j.logger.jdbc.audit = INFO ,jdbc
log4j.additivity.jdbc.audit = false

#只记录对ResultSet对象的JDBC调用
log4j.logger.jdbc.resultset = INFO ,jdbc
log4j.additivity.jdbc.resultset = false

#只记录执行的SQL。
log4j.logger.jdbc.sqlonly = INFO ,sql
log4j.additivity.jdbc.sqlonly = false

#记录有关执行的SQL的时间信息。
log4j.logger.jdbc.sqltiming = INFO ,console
log4j.additivity.jdbc.sqltiming = true

#记录连接打开/关闭事件和连接号码转储
log4j.logger.jdbc.connection = FATAL ,连接
log4j.additivity.jdbc.connection = false

log4j.appender.console=org.apache.log4j.ConsoleAppender  
log4j.appender.console.layout=org.apache.log4j.SimpleLayout 

6、控制台日志如下:


Jfinal中使用日志框架输出完整sql语句信息
            
    
    博客分类: web Jfinalsqllog4j jdbc
 

 

 

  • Jfinal中使用日志框架输出完整sql语句信息
            
    
    博客分类: web Jfinalsqllog4j jdbc
  • 大小: 51.3 KB