PostgreSQL प्रश्नों को कैसे लॉग करें?


372

PostgreSQL 8.3 द्वारा निष्पादित सभी SQL के लॉगिंग को कैसे सक्षम करें?

संपादित (अधिक जानकारी) मैंने इन पंक्तियों को बदल दिया है:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

और PostgreSQL सेवा को पुनरारंभ करें ... लेकिन कोई लॉग नहीं बनाया गया था ... मैं विंडोज सर्वर 2003 का उपयोग कर रहा हूं।

कोई विचार?


15
यह महत्वपूर्ण है:logging_collector = on
bonyiii

इसके अलावा, सावधान रहें कि कुछ GNU / Linux वितरण (जैसे कि डेबियन जेसी) systemctl restart postgresqlवास्तव में आपके द्वारा कॉन्फ़िगर की गई PostgreSQL सेवा को पुनरारंभ नहीं कर सकते हैं (मुझे समझ में नहीं आता कि अभी तक), इसलिए कॉन्फ़िगरेशन फ़ाइल में परिवर्तन लागू नहीं होंगे। इसका उपयोग करना सुरक्षित है pg_ctl(या pg_ctlclusterडेबियन पर)।
स्किप्पी ले ग्रैंड गौरू

4
मैं सिर्फ उबंटू 16.04 LTS में यह परीक्षण किया है, PostgreSQL 9.5 के साथ, और systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadऔर service postgresql restartसभी विन्यास प्रभावी बदलता है प्रस्तुत करना।
बेन जॉनसन

जवाबों:


464

अपनी data/postgresql.confफ़ाइल में, log_statementसेटिंग को परिवर्तित करें 'all'


संपादित करें

आपकी नई जानकारी को देखते हुए, मैं कहूंगा कि सत्यापित करने के लिए कुछ अन्य सेटिंग्स हो सकती हैं:

  • सुनिश्चित करें कि आपने log_destinationचर को चालू कर दिया है
  • सुनिश्चित करें कि आप चालू करें logging_collector
  • यह भी सुनिश्चित करें कि log_directoryनिर्देशिका पहले से ही निर्देशिका के अंदर मौजूद है data, और उपयोगकर्ता जो पोस्टग्रैजेस लिख सकता है।

3
तो बस जिज्ञासु, इसका मतलब यह है कि PostgreSQL लॉगिंग को सक्षम नहीं कर सकता जब तक कि मैं सर्वर को पुनरारंभ नहीं करता? MySQL में, यह "SET GLOBAL general_log = 'ON' के रूप में सरल है;"
एंटनी

7
मैं खुद नहीं जानता कि अगर MySQL की तरह SQL स्टेटमेंट का उपयोग करने का कोई तरीका है, लेकिन आप एक रनिंग सर्वर को कॉन्फ़िगरेशन को फिर से लोड करने के लिए एक कमांड भेज सकते हैंpg_ctl reload
Jarret Hardie

9
PostgreSQL के पास एसक्यूएल स्टेटमेंट्स के माध्यम से अपने मापदंडों को बदलने का कोई तरीका नहीं है (अभी तक 9.2)। अधिकांश लॉगिंग मापदंडों को एक पूर्ण सर्वर पुनरारंभ के बिना बदला जा सकता है, बस इसके बजाय pg_ctl पुनः लोड करके। हालाँकि, यह logging_collector को बदलने के लिए पुनरारंभ होता है।
ग्रेग स्मिथ

6
Postgres 9.4 और नए ALTER SYSTEMकमांड के साथ एक सुपरयुसर SQL से GUC params सेट कर सकता है।
इरविन ब्रान्डेसटेटर

6
dataनिर्देशिका जवाब में उद्धृत शाब्दिक नाम नहीं है, यह data_directoryPostgreSQL कॉन्फ़िगरेशन फ़ाइल में चर को निर्दिष्ट पथ को संदर्भित करता है । डेबियन और उबंटू जीएनयू / लिनक्स पर, यह फ़ाइल आमतौर पर रहती है /etc/postgresql/$v/main/postgresql.conf, जहां $vसर्वर संस्करण है। इसके अलावा, उपरोक्त सिस्टम पर, जब log_destination = 'stderr', आउटपुट को लिखा जाता है /var/log/postgresql/postgresql-$v-main.log, जहां $vसर्वर संस्करण है (अंदर कुछ स्थान पर नहीं data_directory)।
बेन जॉनसन

104

अपने को संपादित करें /etc/postgresql/9.3/main/postgresql.conf, और लाइनों को निम्नानुसार बदलें।

नोट : यदि आपको postgresql.confफ़ाइल नहीं मिली है , तो बस $locate postgresql.confटर्मिनल में टाइप करें

  1. #log_directory = 'pg_log' सेवा log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' सेवा log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' सेवा log_statement = 'all'

  4. #logging_collector = off सेवा logging_collector = on

  5. वैकल्पिक :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart या sudo service postgresql restart

  7. Postgresql में फायर क्वेरी select 2+2

  8. वर्तमान लॉग इन का पता लगाएं /var/lib/pgsql/9.2/data/pg_log/

लॉग फ़ाइलें एक समय में बहुत बढ़ने लगती हैं, और आपकी मशीन को मार सकती हैं। अपनी सुरक्षा के लिए, एक बैश स्क्रिप्ट लिखें जो लॉग को हटा देगा और पोस्टग्रैक्स्ल सर्वर को पुनरारंभ करेगा।

धन्यवाद @ अंपुल, @ जेरेट हार्डी, @ ज़ोल्टन, @ रीक्स बेक, @ लतीफ़ प्रेमानी


2
डेबियन खिंचाव पर, मुझे # log_destination = 'stderr'इस काम करने से पहले कॉन्फ़िगरेशन फ़ाइल में भी असुविधा करना पड़ा ।
फ़िहाग

मैंने आपके कदम का ध्यानपूर्वक पालन किया है और यह काम नहीं करता है। क्या इसे पुनः आरंभ करने की आवश्यकता है?
योहन एआई

2
अगर आप बैश स्क्रिप्ट नहीं लिखना चाहते हैं, लेकिन सिर्फ यह चाहते हैं कि लॉग्स मासिक को अधिलेखित कर दें: log_filename = 'postgresql-%d.log'और नहीं यह प्रत्येक पुनरारंभ के बाद अधिलेखित नहीं होगा, यह प्रत्येक दिन के लिए संलग्न होगा और प्रत्येक महीने को अधिलेखित करेगा। बेशक 28,29,30,31 महीने के आधार पर अलग-अलग दिन हैं - लेकिन आपको यह विचार मिलता है।
sojim2

44
SELECT set_config('log_statement', 'all', true);

संबंधित उपयोगकर्ता अधिकार के साथ कनेक्ट के बाद ऊपर दिए गए क्वेरी का उपयोग कर सकते हैं। सत्र समाप्त होने तक यह लॉगिंग को प्रभावित करेगा।


7
यह आम तौर पर उपयोग SET log_statement = 'all'(या लेन-देन के स्तर के लिए) क्लीनर है SET LOCAL log_statement = 'all'। तुम भी client_min_messagesऔर log_min_messagesसेटिंग्स में रुचि हो सकती है ।
क्रेग रिंगर

1
यह बहुत अच्छा है, क्योंकि मैं अपने कनेक्शन के संदेशों को लॉग करना चाहता हूं। दुर्भाग्य से मुझे मिलता है: permission denied to set parameter "log_statement"चूंकि मेरा उपयोगकर्ता सुपरयुसर नहीं है।
गुत्थी

3
आप फ़ंक्शन को निष्पादित करने वाले अनुदानों के लिए DB व्यवस्थापक से पूछ सकते हैं। GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
रिक्स बेक

35

आपको PostgreSQL में इन पंक्तियों को जोड़ने और सर्वर को पुनरारंभ करने की आवश्यकता है:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

2
logging_collector = on आवश्यक है
wjin

एक जादू की तरह काम करता है। मैं यह कहते हुए कॉन्फिग फाइल पर टिप्पणी से भ्रमित हो गया था Required to be on for csvlogs, यह सोचते हुए कि यह विकल्प क्वेरी आउटपुट लॉग करना था और न केवल कथन, लेकिन यह मामला नहीं है।
जैकोफ़र

अपने डेटा / postgresql.conf फ़ाइल में, log_statement सेटिंग को 'सभी' में बदलें।
फ्लाइंगवी

32

FYI करें: अन्य समाधान केवल डिफ़ॉल्ट डेटाबेस से स्टेटमेंट लॉग इन करेंगे - आमतौर पर postgresदूसरों को लॉग इन करते हैं; उनके समाधान के साथ शुरू करो; फिर:

ALTER DATABASE your_database_name
SET log_statement = 'all';

रेफरी: https://serverfault.com/a/376888 /log_statement



20

उपरोक्त उत्तर के लिए +1। मैं निम्नलिखित विन्यास का उपयोग करता हूं

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'

10

बस CentOS 6.4 (रेड हैट 4.4.7-3) PostgreSQL 9.2, निर्देश पाया के आधार पर चलाने के लिए और अधिक जानकारी के संबंध के लिए इस वेब पेज पर :

  1. सेट करें (असहजता) log_statement = 'all'और log_min_error_statement = errorमें /var/lib/pgsql/9.2/data/postgresql.conf
  2. PostgreSQL कॉन्फ़िगरेशन पुनः लोड करें। मेरे लिए, यह दौड़ कर किया गया था /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/
  3. आज का लॉग इन खोजें /var/lib/pgsql/9.2/data/pg_log/

4
आपको पुनरारंभ करने की आवश्यकता नहीं है - एक pg_ctl reloadपर्याप्त है, और कनेक्शन को बाधित नहीं करता है। यकीन नहीं होता कि यह उत्तर उन लोगों के लिए कुछ भी जोड़ता है जो पहले से ही यहां हैं।
क्रेग रिंगर

1
@CraigRinger टिप्पणी के लिए धन्यवाद, यह काफी महत्वपूर्ण तथ्य है। आपके सुझाव का प्रयास करने के बाद मैं उत्तर को अपडेट करूंगा। मैंने यह उत्तर मुख्य रूप से अपने लिए संदर्भ के लिए लिखा था, क्योंकि उस समय मेरे पास UNIX के साथ बहुत कम अनुभव था, और मैं एक ही स्थान पर सभी आवश्यक जानकारी रखना चाहता था (उदाहरण के लिए postgresql.conf और लॉग फ़ाइलें)।
ज़ोल्टन

0

आपको प्रत्येक विवरण को लॉग करने के लिए इस पैरामीटर को भी सेट करना चाहिए:

log_min_duration_statement = 0

0

मैं सेट करने की कोशिश कर रहा था log_statement कुछ पोस्टग्रेज कॉन्फिग फाइल में लेकिन वास्तव में वह फाइल हमारे पोस्टग्रेज ने नहीं पढ़ी थी।

मैंने पुष्टि की कि अनुरोध का उपयोग करना:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

मैं इस तरह से https://stackoverflow.com/a/41912295/2294168 का उपयोग करता हूं

command: postgres -c config_file=/etc/postgresql.conf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.