2012-06-05 58 views
11

有沒有辦法通過JDBC啓用MySQL通用查詢日誌?我通過搜索找到的最接近的東西是通過JDBC記錄緩慢查詢的能力(http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html)。也許我應該這樣做,並將慢速查詢閾值設置爲0毫秒?使用JDBC啓用MySQL通用查詢日誌

我想通過MySQL以可讀格式記錄所有查詢,並且想要指定日誌文件應該寫入的位置。我知道我的表現會受到打擊,但我的應用程序只有一個用戶,並且很簡單,如果性能受到影響,我會感到驚訝。無論如何,我想試試看。

我相信我的另一個選擇是打開二進制日誌記錄並使用mysqlbinlog將二進制日誌轉換爲人類可讀的格式,但它聽起來像一般的查詢日誌將提供一個更簡單的方法來獲得我想要的。

回答

3

我最終找到了解決方法。我通過在運行時使用以下SQL查詢修改MySQL全局系統變量來啓用Java通用查詢日誌。

SET GLOBAL log_output="FILE" 
SET GLOBAL general_log_file="Path/File" 
SET GLOBAL general_log='ON' 

我推薦在general_log_file路徑中使用正斜槓。即使在Windows環境下,我也無法使用反斜槓工作。

我使用以下SQL查詢在運行時禁用常規查詢日誌記錄。

SET GLOBAL general_log='OFF' 
3

如果您使用Hibernate並通過它執行所有數據訪問,則可以通過將屬性hibernate.show_sql設置爲true來打開日誌記錄。不過,這會寫入參數化語句(例如SELECT foo.id FROM foo WHERE foo.bar = ?)。如果你需要參數值,或者不使用像Hibernate這樣的工具,你可能需要讓MySQL寫這個日誌。請參閱general query log上的MySQL文檔。我們可以看到,MySQL二進制日誌是一種不同的方式,它記錄對數據的更改,並用於增量備份和/或複製。 SELECT語句不記錄在二進制日誌中。

編輯: 我能得到MySQL的加入下面的兩行my.cnf文件(既不確認變量已經設置之後),並重新啓動MySQL來寫通用日誌:


general_log = 1 
general_log_file=/tmp/mysql-general.log 
+0

埃裏克,我還沒有看到正式文件的頁面通過可以理解的MySQL,我已經使用了它5年。我可以非常具體地指出該頁面上的含糊不清。你可以顯示一個示例查詢來打開一般查詢日誌嗎?我不知道我是否也使用hibernate。如果你能告訴我如何檢查,我可以讓你知道,但是。 –

25

您可以在JDBC URL這樣啓用日誌記錄:

jdbc:mysql://host/db?logger=com.mysql.jdbc.log.Log4JLogger&profileSQL=true 

其他日誌後端可用(CommonsLogger,Slf4jLogger,JDK14Logger)。我相信由於授權問題,直接Log4J日誌記錄在某個時候被刪除,所以它可能無法與您的JDBC驅動程序版本一起使用。

當然,您需要在類路徑中使用相關日誌記錄庫的JAR,並且需要一個配置文件(log4j.properties)。我會首先將根級別設置爲TRACE,以查看發生了什麼並在您看到記錄的內容後按日誌級別和類別將其嚴格化。

延伸閱讀:

HTH

+0

謝謝!這實際上是在使用不容易添加日誌記錄參數的黑盒/閉源框架時 –

6

添加 '記錄' 和 'profileSQL' 的JDBC URL:

&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true 

然後你會得到下面的SQL語句:

2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 message: SET sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES' 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 13 resultset: 17 message: select 1 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 13 resultset: 17 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 15 resultset: 18 message: select @@session.tx_read_only 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 15 resultset: 18 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 14 resultset: 0 message: update sequence set seq=seq+incr where name='demo' and seq=4602 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 14 resultset: 0 

默認記錄是:

com.mysql.jdbc.log.StandardLogger 

MySQL的JDBC屬性列表:https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html