log4jdbc数据库访问日志框架使用

log4jdbc官网地址

http://code.google.com/p/log4jdbc/

https://github.com/arthurblake/log4jdbc

当前最新版本是1.2, 支持JDBC3, JDBC4

log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,方便直接拷贝sql在数据库客户端运行

未使用log4jdbc记录的SQL:

 select count(*) from region where id=?

使用 log4jdbc记录的SQL:

select count(*) from region where id='gz'

log4jdbc特点

  1. 全面支持JDBC 3和JDBC 4!

  2. 容易配置,在大多数情况下,你需要做的是改变驱动类名net.sf.log4jdbc.DriverSpy的,并在前面加上“为jdbc:log4jdbc”到你现有的JDBC URL,建立你的日志记录类别。

    示例:jdbc:log4jdbc:mysql://192.168.0.207:3306/mall

  3. 自动SQL输出。这大大提高了许多情况下的可读性和调试。

  4. 可以打印SQL的执行时间,用来调试SQL的执行效率。

  5. 生成SQL连接数信息,以帮助识别连接池或线程问题。

  6. 底层的JDBC驱动程序的兼容,使用JDK 1.4以上和SLF4J 1.x

log4jdbc设置的logger

?
1
2
3
4
5
6
7
logger                 描述
jdbc.sqlonly           仅记录SQL。
jdbc.sqltiming         计时统计SQL的执行用时。
jdbc.audit             记录所有的JDBC调用(ResultSet的除外)。Log量非常大,会影响性能,建议关闭。
                        一般情况下不需要开这个设定,除非追踪一个特定的JDBC问题。
jdbc.resultset         比audit量更大,包括ResultSet对象,记录所有的JDBC记录。建议关闭
jdbc.connection        记录打开和关闭连接以及打开的连接数。用于追踪连接泄漏问题,非常有用。

使用方法

1: 在log4j配置文件中增加对应的logger

2:   改变驱动类名,

        如MYSQL的:jdbc:log4jdbc:mysql://192.168.0.207:3306/mall

        如Derby的:jdbc:log4jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/databases/MyDatabase

log4j配置样例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?xml version= "1.0"  encoding= "UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM  "log4j.dtd" >
<log4j:configuration xmlns:log4j= "http://jakarta.apache.org/log4j/" debug= "false" >
  <appender name= "CONSOLE"  class = "org.apache.log4j.ConsoleAppender" >
     <layout  class = "org.apache.log4j.PatternLayout" >
     <param name= "conversionPattern"  value= "%d %p [%c:%L] - %m%n"  />
     </layout>
     <filter  class = "org.apache.log4j.varia.LevelRangeFilter" >
     <param name= "LevelMin"  value= "INFO"  />
     </filter>
  </appender> 
  <appender name= "sql-appender"  class = "org.apache.log4j.RollingFileAppender" >
     <param name= "File"  value= "${log.dir}/logs/sql.log" />
     <param name= "MaxBackupIndex"  value= "20" />
     <param name= "MaxFileSize"  value= "20MB" />
     <param name= "Append"  value= "true" />
     <layout  class = "org.apache.log4j.PatternLayout" >
       <param name= "ConversionPattern"  value= "%d %p [%c:%L] - %m%n" />
     </layout>
   </appender>
   <appender name= "sql-timing-appender"  class = "org.apache.log4j.FileAppender" >
     <param name= "File"  value= "${log.dir}/logs/sqltiming.log" />
     <param name= "MaxBackupIndex"  value= "20" />
     <param name= "MaxFileSize"  value= "20MB" />
     <param name= "Append"  value= "true" />
     <layout  class = "org.apache.log4j.PatternLayout" >
       <param name= "ConversionPattern"  value= "%d %p [%c:%L] - %m%n" />
     </layout>
   </appender>
   <appender name= "jdbc-appender"  class = "org.apache.log4j.FileAppender" >
     <param name= "File"  value= "${log.dir}/logs/jdbc.log" />
     <param name= "MaxBackupIndex"  value= "20" />
     <param name= "MaxFileSize"  value= "20MB" />
     <param name= "Append"  value= "true" />
     <layout  class = "org.apache.log4j.PatternLayout" >
       <param name= "ConversionPattern"  value= "%d %p [%c:%L] - %m%n" />
     </layout>
   </appender>
   <appender name= "jdbc-connection"  class = "org.apache.log4j.FileAppender" >
     <param name= "File"  value= "${log.dir}/logs/connection.log" />
     <param name= "MaxBackupIndex"  value= "20" />
     <param name= "MaxFileSize"  value= "20MB" />
     <param name= "Append"  value= "true" />
     <layout  class = "org.apache.log4j.PatternLayout" >
       <param name= "ConversionPattern"  value= "%d %p [%c:%L] - %m%n" />
     </layout>
   </appender>
 
   <!-- log SQL (pre-execution) plus exceptions caused by SQL -->
   <logger name= "jdbc.sqlonly"  additivity= "false" >
     <level value= "debug" />
     <appender-ref ref= "sql-appender" />
   </logger>
 
   <!-- log SQL with timing information, post execution -->
   <logger name= "jdbc.sqltiming"  additivity= "false" >
     <level value= "fatal" />
     <appender-ref ref= "sql-timing-appender" />
   </logger>
 
   <!-- only use the two logs below to trace ALL JDBC information,
        NOTE:  This can be very voluminous!  -->
   <!-- log all jdbc calls except ResultSet calls -->
   <logger name= "jdbc.audit"  additivity= "false" >
     <level value= "fatal" />
     <appender-ref ref= "jdbc-appender" />
   </logger>
 
   <!-- log the jdbc ResultSet calls -->
   <logger name= "jdbc.resultset"  additivity= "false" >
     <level value= "fatal" />
     <appender-ref ref= "jdbc-appender" />
   </logger>
  
   <!-- log connection open/close events and dump of all open connection numbers -->
   <logger name= "jdbc.connection"  additivity= "false" >
     <level value= "fatal" />
     <appender-ref ref= "connection-appender" />
   </logger>
 
   <!--  this  log is  for  internal debugging of log4jdbc, itself -->
   <!-- debug logging  for  log4jdbc itself -->
   <logger name= "log4jdbc.debug"  additivity= "false" >
     <level value= "debug" />
     <appender-ref ref= "stdout-appender" />
   </logger>
<root>
   <level value= "info"  />
   <appender-ref ref= "CONSOLE"  />
</root>
</log4j:configuration>

程序调用示例

?
1
2
3
4
5
6
7
8
9
10
11
12
public  class  Demo {
     private  static  Logger log = LoggerFactory.getLogger(Demo. class );
 
 
     public  static  void  main(String[] args)  throws  SQLException {
         log.info( "开始" );
         Connection conn = DBUtils.getConnection();
         conn.createStatement().execute( "select count(*) from xbm_region" );
         JdbcUtils.executeQuery( "select count(*) from xbm_region where id=?" "xxx" );
         log.info( "完成" );
     }
}

来源:http://my.oschina.net/cloudcoder/blog/420510?fromerr=BV87XkL5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值