1. 程式人生 > >使用Log4jdbc-log4j2監聽MyBatis中執行的SQL和Connection

使用Log4jdbc-log4j2監聽MyBatis中執行的SQL和Connection

引言: 在專案中使用了MyBatis,一個比較苦惱的問題是無法看到執行的SQL的具體情況,所以,就找到了Log4jdbc-log4j2。這個是一個基於jdbc層面的監聽工具,可以監聽對於資料庫的主要操作,從而完美的檢視到其中執行的操作。

1. Log4jdbc-log4j2版本選擇

2.  如何引入到專案?

     如果專案是基於Maven工具,則可以直接使用如下依賴,即可完美解決問題:

  1. <dependency>
  2.   <groupId>org.bgee.log4jdbc-log4j2</groupId>
  3.   <artifactId>log4jdbc-log4j2-jdbcXX
    </artifactId>
  4.   <version>1.16</version>
  5. </dependency>
3.  依賴包的安裝

    a.  如有使用log4j, 則需要log4j.-core.jar和log4j-api.jar

    b.  如使用slf4j,則需要 slf4j-api.jar

4.  修改資料庫連線中的jdbc.url和driver.Class

  1. xxx.driverClass=<strong>net.sf.log4jdbc.sql.jdbcapi.DriverSpy</strong>   ------ 資料庫驅動程式  
  2. ............................  
  3. xxxx.jdbcUrl = <strong>jdbc:log4</strong>\:oracle\:thin\:@192.168.1.20\:1521\:orcl    -------------- 資料庫連線URL  
  說明:其中加粗的內容,表示其是被修改後的新內容。

  原有的URL:

jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/databases/MyDatabase

  替換的URL:

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

5.  配置好log4j和log4j.properties

6.  新增log4jdbc.log4j2.properties

   這裡使用Slf4j API, 宣告如下:

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
7.  可用的Logger
logger description
jdbc.sqlonly Logs only SQL. SQL executed within a prepared statement is automatically shown with it's bind arguments replaced with the data bound at that position, for greatly increased readability.
jdbc.sqltiming Logs the SQL, post-execution, including timing statistics on how long the SQL took to execute.
jdbc.audit Logs ALL JDBC calls except for ResultSets. This is a very voluminous output, and is not normally needed unless tracking down a specific JDBC problem.
jdbc.resultset Even more voluminous, because all calls to ResultSet objects are logged.
jdbc.resultsettable Log the jdbc results as a table. Level debug will fill in unread values in the result set.
jdbc.connection Logs connection open and close events as well as dumping all open connection numbers. This is very useful for hunting down connection leak problems.

這些都是需要配置到log4j.properties或者log4j.xml中去的。

示例如下:

  1. ! Log all JDBC calls except for ResultSet calls  
  2. log4j.logger.jdbc.audit=DEBUG,jdbc  
  3. log4j.additivity.jdbc.audit=false
  4. ! Log only JDBC calls to ResultSet objects  
  5. log4j.logger.jdbc.resultset=DEBUG,jdbc  
  6. log4j.additivity.jdbc.resultset=false
  7. ! Log only the SQL that is executed.  
  8. log4j.logger.jdbc.sqlonly=DEBUG,sql  
  9. log4j.additivity.jdbc.sqlonly=false
  10. ! Log timing information about the SQL that is executed.  
  11. log4j.logger.jdbc.sqltiming=DEBUG,sqltiming  
  12. log4j.additivity.jdbc.sqltiming=false
  13. ! Log connection open/close events and connection number dump  
  14. log4j.logger.jdbc.connection=FATAL,connection  
  15. log4j.additivity.jdbc.connection=false
  16. ! the appender used for the JDBC API layer call logging above, sql only  
  17. log4j.appender.sql=org.apache.log4j.FileAppender  
  18. log4j.appender.sql.File=./logs/sql.log  
  19. log4j.appender.sql.Append=false
  20. log4j.appender.sql.layout=org.apache.log4j.PatternLayout  
  21. log4j.appender.sql.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n  
  22. ! the appender used for the JDBC API layer call logging above, sql timing  
  23. log4j.appender.sqltiming=org.apache.log4j.FileAppender  
  24. log4j.appender.sqltiming.File=./logs/sqltiming.log  
  25. log4j.appender.sqltiming.Append=false
  26. log4j.appender.sqltiming.layout=org.apache.log4j.PatternLayout  
  27. log4j.appender.sqltiming.layout.ConversionPattern=-----> %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n%n  
  28. ! the appender used for the JDBC API layer call logging above  
  29. log4j.appender.jdbc=org.apache.log4j.FileAppender  
  30. log4j.appender.jdbc.File=./logs/jdbc.log  
  31. log4j.appender.jdbc.Append=false
  32. log4j.appender.jdbc.layout=org.apache.log4j.PatternLayout  
  33. log4j.appender.jdbc.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n  
  34. ! the appender used for the JDBC Connection open and close events  
  35. log4j.appender.connection=org.apache.log4j.FileAppender  
  36. log4j.appender.connection.File=./logs/connection.log  
  37. log4j.appender.connection.Append=false
  38. log4j.appender.connection.layout=org.apache.log4j.PatternLayout  
  39. log4j.appender.connection.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n  

總結:

   經過一番折騰之後呢,終於可以在系統看到資料庫中各類的操作了,資料庫的各種行為盡在眼底........