log4jdbc資料庫訪問日誌框架使用

五柳-先生發表於2016-05-04

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

相關文章