จะบันทึกการสืบค้น PostgreSQL ได้อย่างไร?


373

จะเปิดใช้งานการบันทึกของ SQL ทั้งหมดที่ดำเนินการโดย PostgreSQL 8.3 ได้อย่างไร

แก้ไข (ข้อมูลเพิ่มเติม) ฉันเปลี่ยนบรรทัดเหล่านี้:

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

และเริ่มบริการ PostgreSQL อีกครั้ง แต่ไม่มีการสร้างบันทึก ... ฉันใช้ Windows Server 2003

ความคิดใด ๆ


15
สิ่งนี้สำคัญ:logging_collector = on
bonyiii

นอกจากนี้ระวังว่าใน GNU / Linux ดิสทริบิวชันบางตัว (เช่น Debian Jessie) systemctl restart postgresqlอาจไม่เริ่มบริการ PostgreSQL ที่คุณได้ตั้งค่าไว้ (ฉันยังไม่เข้าใจสาเหตุ) ดังนั้นการเปลี่ยนแปลงในไฟล์กำหนดค่าจะไม่ถูกนำมาใช้ มันปลอดภัยกว่าที่จะใช้pg_ctl(หรือpg_ctlclusterบน Debian)
Skippy le Grand Gourou

4
ฉันเพิ่งผ่านการทดสอบใน Ubuntu 16.04 LTS กับ PostgreSQL 9.5 และsystemctl reload postgresql, systemctl restart postgresql, service postgresql reloadและservice postgresql restartทั้งหมดทำให้การกำหนดค่าการเปลี่ยนแปลงที่มีประสิทธิภาพ
เบ็นจอห์นสัน

คำตอบ:


465

ในตัวคุณ data/postgresql.confไฟล์เปลี่ยนการตั้งค่าไปlog_statement'all'


แก้ไข

ดูข้อมูลใหม่ของคุณฉันจะบอกว่าอาจมีการตั้งค่าอื่น ๆ เพื่อยืนยัน:

  • ตรวจสอบให้แน่ใจว่าคุณได้เปิด log_destinationตัวแปร
  • ให้แน่ใจว่าคุณเปิด logging_collector
  • ตรวจสอบให้แน่ใจว่ามีlog_directoryไดเรกทอรีอยู่แล้วในdataไดเรกทอรีและผู้ใช้ postgres สามารถเขียนลงไปได้

3
ดังนั้นเพียงแค่อยากรู้อยากเห็นนั่นหมายความว่า PostgreSQL ไม่สามารถเปิดใช้งานการบันทึกถ้าฉันรีสตาร์ทเซิร์ฟเวอร์? ใน MySQL มันง่ายเหมือน "SET GLOBAL general_log = 'ON';"
Antony

7
ตัวฉันเองไม่รู้ว่ามีวิธีการใช้คำสั่ง SQL เช่น MySQL หรือไม่ แต่คุณสามารถส่งเซิร์ฟเวอร์ที่รันคำสั่งเพื่อโหลดการกำหนดค่าใหม่ด้วยpg_ctl reload
Jarret Hardie

9
PostgreSQL ยังไม่มีวิธีเปลี่ยนพารามิเตอร์ผ่านคำสั่ง SQL (จาก 9.2) พารามิเตอร์การบันทึกส่วนใหญ่สามารถเปลี่ยนแปลงได้โดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์โดยเพียงแค่ทำการรีโหลด pg_ctl แทน อย่างไรก็ตามจะใช้เวลาเริ่มต้นใหม่เพื่อเปลี่ยน logging_collector
เกร็กสมิ ธ

6
ด้วย Postgres 9.4 และALTER SYSTEMคำสั่งใหม่superuser สามารถตั้งค่า GUC params จาก SQL
Erwin Brandstetter

6
dataไดเรกทอรีที่อ้างถึงในคำตอบคือไม่ใช่ชื่อที่แท้จริงของตน มันอ้างถึงเส้นทางที่กำหนดให้กับdata_directoryตัวแปรในไฟล์กำหนดค่า PostgreSQL บน Debian และ Ubuntu GNU / Linux ไฟล์นี้มักจะอยู่/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/

ไฟล์บันทึกมีแนวโน้มที่จะเติบโตได้ตลอดเวลาและอาจทำให้เครื่องของคุณหยุดทำงาน เพื่อความปลอดภัยของคุณเขียนสคริปต์ทุบตีที่จะลบบันทึกและรีสตาร์ทเซิร์ฟเวอร์ postgresql

ขอบคุณ @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani


2
เมื่อยืดเดเบียนฉันต้องยกเลิกการคอมเมนต์# log_destination = 'stderr'ในไฟล์การกำหนดค่าก่อนที่จะทำงานได้
phihag

ฉันทำตามขั้นตอนของคุณอย่างระมัดระวังแล้ว แต่ก็ไม่ได้ผล ต้องรีสตาร์ทหรือไม่
Yohanes AI

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การตั้งค่า
Craig Ringer

1
เป็นสิ่งที่ดีมากเนื่องจากฉันต้องการบันทึกข้อความการเชื่อมต่อของฉัน น่าเสียดายที่ฉันได้รับ: permission denied to set parameter "log_statement"เนื่องจากผู้ใช้ของฉันไม่ใช่ superuser
guettli

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 ]
Rix Beck

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คิดว่าตัวเลือกนี้คือการบันทึกผลลัพธ์ของแบบสอบถามและไม่ใช่แค่คำสั่ง แต่ไม่ใช่กรณี
Jacopofar

ในไฟล์ data / postgresql.conf ของคุณเปลี่ยนการตั้งค่า log_statement เป็น 'all'
FlyingV

32

FYI: โซลูชันอื่นจะบันทึกเฉพาะคำสั่งจากฐานข้อมูลเริ่มต้น - โดยปกติpostgres- เพื่อบันทึกอื่น ๆ เริ่มต้นด้วยวิธีแก้ปัญหาของพวกเขา แล้ว:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Ref: 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 (Red Hat 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
คุณไม่จำเป็นต้องรีสตาร์ท - a pg_ctl reloadเพียงพอและไม่ขัดจังหวะการเชื่อมต่อ ไม่เชื่อว่าคำตอบนี้จะเพิ่มสิ่งใด ๆ ให้กับผู้ที่อยู่ที่นี่แล้ว
Craig Ringer

1
@ CraigRinger ขอบคุณสำหรับความคิดเห็นที่ค่อนข้างเป็นความจริงที่สำคัญ ฉันจะอัปเดตคำตอบเมื่อฉันลองทำตามคำแนะนำของคุณแล้ว ฉันเขียนคำตอบนี้เป็นหลักสำหรับการอ้างอิงสำหรับตัวเองเพราะในขณะที่ฉันมีประสบการณ์น้อยมากกับ UNIX และฉันต้องการข้อมูลที่จำเป็นทั้งหมดในที่เดียว (เช่นตำแหน่งที่ตั้งของ postgresql.conf และไฟล์บันทึก)
Zoltan

0

คุณควรตั้งค่าพารามิเตอร์นี้เพื่อบันทึกทุกคำสั่ง:

log_min_duration_statement = 0

0

ฉันพยายามตั้งค่าlog_statementไฟล์ postgres config บางอัน แต่อันที่จริงแล้วไฟล์ postgres ของเราไม่ได้อ่าน

ฉันยืนยันว่าใช้คำขอ:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.