使用Log4jdbc-log4j2監聽MyBatis中執行的SQL和Connection
阿新 • • 發佈:2019-01-23
引言: 在專案中使用了MyBatis,一個比較苦惱的問題是無法看到執行的SQL的具體情況,所以,就找到了Log4jdbc-log4j2。這個是一個基於jdbc層面的監聽工具,可以監聽對於資料庫的主要操作,從而完美的檢視到其中執行的操作。
1. Log4jdbc-log4j2版本選擇
2. 如何引入到專案?
如果專案是基於Maven工具,則可以直接使用如下依賴,即可完美解決問題:
- <dependency>
- <groupId>org.bgee.log4jdbc-log4j2</groupId>
-
<artifactId>log4jdbc-log4j2-jdbcXX
- <version>1.16</version>
- </dependency>
a. 如有使用log4j, 則需要log4j.-core.jar和log4j-api.jar
b. 如使用slf4j,則需要 slf4j-api.jar
4. 修改資料庫連線中的jdbc.url和driver.Class
-
xxx.driverClass=<strong>net.sf.log4jdbc.sql.jdbcapi.DriverSpy</strong> ------ 資料庫驅動程式
- ............................
- 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.Slf4jSpyLogDelegator7. 可用的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中去的。
示例如下:
- ! Log all JDBC calls except for ResultSet calls
- log4j.logger.jdbc.audit=DEBUG,jdbc
- log4j.additivity.jdbc.audit=false
- ! Log only JDBC calls to ResultSet objects
- log4j.logger.jdbc.resultset=DEBUG,jdbc
- log4j.additivity.jdbc.resultset=false
- ! Log only the SQL that is executed.
- log4j.logger.jdbc.sqlonly=DEBUG,sql
- log4j.additivity.jdbc.sqlonly=false
- ! Log timing information about the SQL that is executed.
- log4j.logger.jdbc.sqltiming=DEBUG,sqltiming
- log4j.additivity.jdbc.sqltiming=false
- ! Log connection open/close events and connection number dump
- log4j.logger.jdbc.connection=FATAL,connection
- log4j.additivity.jdbc.connection=false
- ! the appender used for the JDBC API layer call logging above, sql only
- log4j.appender.sql=org.apache.log4j.FileAppender
- log4j.appender.sql.File=./logs/sql.log
- log4j.appender.sql.Append=false
- log4j.appender.sql.layout=org.apache.log4j.PatternLayout
- 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=./logs/sqltiming.log
- log4j.appender.sqltiming.Append=false
- 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=./logs/jdbc.log
- log4j.appender.jdbc.Append=false
- 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=./logs/connection.log
- log4j.appender.connection.Append=false
- log4j.appender.connection.layout=org.apache.log4j.PatternLayout
- log4j.appender.connection.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
總結:
經過一番折騰之後呢,終於可以在系統看到資料庫中各類的操作了,資料庫的各種行為盡在眼底........