2012-06-05 11 views
11

के साथ MySQL सामान्य क्वेरी लॉग को सक्षम करना क्या जेडीबीसी के माध्यम से MySQL सामान्य क्वेरी लॉगिंग को सक्षम करने का कोई तरीका है? मेरी खोज के माध्यम से मुझे मिली सबसे नज़दीकी चीज जेडीबीसी (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html) के माध्यम से धीमी क्वेरी लॉग करने की क्षमता है। शायद मुझे ऐसा करना चाहिए और धीमी क्वेरी थ्रेसहोल्ड 0 एमएस पर सेट करना चाहिए?जेडीबीसी

मैं एक मानव-पठनीय प्रारूप में MySQL के माध्यम से सभी प्रश्नों को लॉग करना चाहता हूं और उस स्थान को निर्दिष्ट करना चाहता हूं जहां लॉग फ़ाइल लिखी जानी चाहिए। मुझे पता है कि मैं एक प्रदर्शन हिट लेगा, लेकिन मेरे आवेदन में केवल एक उपयोगकर्ता है और यह इतना आसान है कि प्रदर्शन हिट नोटिस करने पर मुझे आश्चर्य होगा। मैं इसे देखने के लिए वैसे भी कोशिश करना चाहता हूं।

मेरा मानना ​​है कि मेरे पास एक और विकल्प है जो बाइनरी लॉगिंग चालू करना है और बाइनरी लॉग को मानव-पठनीय प्रारूप में परिवर्तित करने के लिए mysqlbinlog का उपयोग करना है, लेकिन ऐसा लगता है कि सामान्य क्वेरी लॉग मुझे जो चाहिए वह प्राप्त करने का एक आसान माध्यम प्रदान करेगा।

उत्तर

3

मैं एक कामकाज खोजने के लिए समाप्त हो गया। मैं निम्नलिखित SQL क्वेरी के साथ रनटाइम पर MySQL वैश्विक सिस्टम चर को संशोधित करके जावा के माध्यम से MySQL सामान्य क्वेरी लॉगिंग सक्षम करता हूं।

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

मैं सामान्य_log_file पथ में आगे की स्लैश का उपयोग करने की अनुशंसा करता हूं। मुझे विंडोज वातावरण में भी काम करने के लिए बैकस्लाश नहीं मिल सका।

मैं निम्न SQL क्वेरी के साथ रनटाइम पर सामान्य क्वेरी लॉगिंग अक्षम करता हूं।

SET GLOBAL general_log='OFF' 
3

यदि आप हाइबरनेट का उपयोग कर रहे हैं, और इसके माध्यम से सभी डेटा एक्सेस निष्पादित करते हैं, तो आप संपत्ति hibernate.show_sql को सत्य पर सेट करके लॉगिंग चालू कर सकते हैं। यह पैरामीटरयुक्त कथन (उदा। SELECT foo.id FROM foo WHERE foo.bar = ?) लिखेंगे, हालांकि। यदि आपको पैरामीटर मानों की आवश्यकता है, या Hibernate जैसे टूल का उपयोग न करें, तो आपको MySQL इस लॉग को लिखने की आवश्यकता हो सकती है। general query log पर MySQL दस्तावेज़ देखें।

FWIW, MySQL बाइनरी लॉग एक अलग अंत का माध्यम है; यह डेटा में परिवर्तन रिकॉर्ड करता है, और वृद्धिशील बैकअप और/या प्रतिकृति के लिए उपयोग किया जाता है। SELECT विवरण बाइनरी लॉग में दर्ज नहीं हैं।

संपादित करें: मैं (न चर पहले से ही स्थापित किया गया था पुष्टि करने के बाद) my.cnf के लिए निम्न दो पंक्तियों जोड़ने, और पुन: प्रारंभ MySQL द्वारा सामान्य लॉग लिखने के लिए MySQL प्राप्त करने में सक्षम था:


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

एरिक, मैं नहीं आधिकारिक दस्तावेज के एक पेज देखा है MySQL द्वारा जो कभी समझ में आया था, और मैं इसे 5 वर्षों तक उपयोग कर रहा हूं। मैं उस पृष्ठ पर अस्पष्टता को इंगित करने के लिए बहुत विशिष्ट हो सकता हूं। क्या आप सामान्य क्वेरी लॉग को चालू करने के लिए एक उदाहरण क्वेरी दिखा सकते हैं? मुझे नहीं पता कि मैं हाइबरनेट का उपयोग करता हूं या नहीं। यदि आप मुझे बता सकते हैं कि इसे कैसे जांचें, तो मैं आपको बता सकता हूं। –

25

आप इस तरह JDBC URL में लॉगिंग सक्षम कर सकते हैं:

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

अन्य प्रवेश बैकेंड उपलब्ध हैं (CommonsLogger, Slf4jLogger, JDK14Logger)। मेरा मानना ​​है कि लाइसेंसिंग मुद्दों के कारण किसी भी समय प्रत्यक्ष लॉग 4 जे लॉगिंग गिरा दी गई थी, इसलिए यह जेडीबीसी चालक के आपके संस्करण के साथ काम नहीं कर सकता है।

स्वाभाविक रूप से, आपको अपने क्लासपाथ में प्रासंगिक लॉगिंग लाइब्रेरी के JAR और कॉन्फ़िगरेशन फ़ाइल (log4j.properties) की आवश्यकता होगी। एक बार जब आप लॉग इन हो रहे हैं तो यह देखने के लिए कि क्या हो रहा है और लॉग स्तर और श्रेणी द्वारा इसे कसने के लिए पहले रूट स्तर को ट्रैस पर सेट कर दिया जाएगा।

अतिरिक्त पठन:

HTH

+0

धन्यवाद! यह वास्तव में ब्लैकबॉक्स/बंद स्रोत ढांचे का उपयोग करते समय है जो लॉगिंग तर्क जोड़ने में आसानी से समर्थन नहीं करते हैं –

6

जोड़े 'लकड़हारा' और 'profileSQL' JDBC यूआरएल के लिए:

&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

संबंधित मुद्दे