2012-06-05 41 views
11

Có cách nào để bật ghi nhật ký truy vấn chung của MySQL thông qua JDBC không? Điều gần nhất tôi tìm thấy thông qua tìm kiếm của tôi là khả năng ghi lại các truy vấn chậm thông qua JDBC (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html). Có lẽ tôi nên làm điều đó và thiết lập các ngưỡng truy vấn chậm đến 0 ms?Bật nhật ký truy vấn chung của MySQL với JDBC

Tôi muốn đăng nhập tất cả các truy vấn thông qua MySQL ở định dạng có thể đọc được và muốn chỉ định vị trí nơi tệp nhật ký sẽ được ghi. Tôi biết tôi sẽ có một hit hiệu suất, nhưng ứng dụng của tôi chỉ có một người dùng và đơn giản là đủ để tôi sẽ ngạc nhiên nếu hiệu suất đạt được đáng chú ý. Tôi muốn thử nó ra để xem. Tôi tin rằng một tùy chọn khác mà tôi có là bật tính năng ghi nhật ký nhị phân và sử dụng mysqlbinlog để chuyển đổi nhật ký nhị phân sang định dạng có thể đọc được, nhưng có vẻ như nhật ký truy vấn chung sẽ cung cấp phương tiện đơn giản hơn để nhận những gì tôi muốn.

Trả lời

3

Tôi đã tìm được cách giải quyết. Tôi cho phép ghi nhật ký truy vấn chung của MySQL thông qua Java bằng cách sửa đổi các biến hệ thống toàn cục của MySQL khi chạy với các truy vấn SQL sau đây.

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

Tôi khuyên bạn nên sử dụng dấu gạch chéo chuyển tiếp trong đường dẫn chung_log_file. Tôi không thể nhận được dấu gạch chéo ngược để làm việc, ngay cả trong môi trường Windows.

Tôi tắt ghi nhật ký truy vấn chung khi chạy bằng truy vấn SQL sau.

SET GLOBAL general_log='OFF' 
3

Nếu bạn đang sử dụng Hibernate và thực hiện tất cả truy cập dữ liệu qua đó, bạn có thể bật ghi nhật ký bằng cách đặt thuộc tính hibernate.show_sql thành true. Tuy nhiên, điều này sẽ viết các câu lệnh được tham số hóa (ví dụ: SELECT foo.id FROM foo WHERE foo.bar = ?). Nếu bạn cần giá trị tham số hoặc không sử dụng công cụ như Hibernate, bạn có thể cần phải có MySQL ghi nhật ký này. Xem tài liệu MySQL trên general query log.

FWIW, nhật ký nhị phân MySQL là phương tiện để kết thúc khác; nó ghi lại các thay đổi đối với dữ liệu và được sử dụng để sao lưu gia tăng và/hoặc sao chép. SELECT báo cáo không được ghi lại trong nhật ký nhị phân.

EDIT: tôi đã có thể để có được MySQL để viết nhật ký chung bằng cách thêm hai dòng sau vào my.cnf (sau khi xác nhận không phải biến đã được thiết lập), và khởi động lại MySQL:


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

Eric, tôi đã không nhìn thấy một trang của tài liệu chính thức bởi MySQL mà có thể hiểu được, bao giờ hết, và tôi đã sử dụng nó trong 5 năm. Tôi có thể rất cụ thể chỉ ra sự mơ hồ trên trang đó. Bạn có thể hiển thị truy vấn mẫu để bật nhật ký truy vấn chung không? Tôi cũng không biết mình có sử dụng ngủ đông hay không. Nếu bạn có thể cho tôi biết làm thế nào để kiểm tra điều đó, mặc dù tôi có thể cho bạn biết. –

25

Bạn có thể cho phép đăng nhập vào URL JDBC như thế này:

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

backends khai thác gỗ khác có sẵn (CommonsLogger, Slf4jLogger, JDK14Logger). Tôi tin rằng việc ghi nhật ký Log4J trực tiếp đã bị hủy bỏ tại một số điểm do các vấn đề cấp phép để nó có thể không hoạt động với phiên bản trình điều khiển JDBC của bạn.

Đương nhiên, bạn sẽ cần JAR của thư viện ghi nhật ký có liên quan trong đường dẫn lớp của bạn và tệp cấu hình (log4j.properties). Tôi sẽ thiết lập cấp độ gốc để TRACE đầu tiên để xem những gì đang xảy ra và thắt chặt nó bằng cấp độ đăng nhập và thể loại một khi bạn nhìn thấy những gì đang được đăng nhập.

Tiếp tục đọc:

HTH

+0

Cảm ơn! Điều này thực sự là khi sử dụng khung công tác mã nguồn mở/hộp đen không dễ dàng hỗ trợ thêm đối số ghi nhật ký –

6

Add 'logger' và 'profileSQL' để url jdbc:

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

Sau đó, bạn sẽ nhận được câu lệnh SQL dưới đây:

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 

Các logger mặc định là:

com.mysql.jdbc.log.StandardLogger 

Mysql danh sách tài sản jdbc: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

Các vấn đề liên quan