Bagaimana cara log kueri PostgreSQL?

373

Bagaimana cara mengaktifkan pencatatan semua SQL yang dijalankan oleh PostgreSQL 8.3?

Diedit (info lebih lanjut) saya mengubah baris ini:

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

Dan restart layanan PostgreSQL ... tetapi tidak ada log yang dibuat ... Saya menggunakan Windows Server 2003.

Ada ide?

Paul
sumber
15
Ini penting:logging_collector = on
bonyiii
Juga, berhati-hatilah bahwa pada beberapa distribusi GNU / Linux (mis. Debian Jessie) systemctl restart postgresqlmungkin tidak benar-benar memulai kembali layanan PostgreSQL yang telah Anda konfigurasikan (saya belum mengerti mengapa), jadi perubahan dalam file konfigurasi tidak akan diterapkan. Lebih aman digunakan pg_ctl(atau pg_ctlclusterdi Debian).
Skippy le Grand Gourou
4
Aku hanya diuji ini di Ubuntu 16.04 LTS, dengan PostgreSQL 9.5, dan systemctl reload postgresql, systemctl restart postgresql, service postgresql reloaddan service postgresql restartsemua membuat perubahan konfigurasi yang efektif.
Ben Johnson

Jawaban:

466

Di data/postgresql.conffile Anda , ubah log_statementpengaturan menjadi 'all'.


Edit

Melihat informasi baru Anda, saya akan mengatakan mungkin ada beberapa pengaturan lain untuk memverifikasi:

  • pastikan Anda telah menghidupkan log_destinationvariabel
  • pastikan Anda mengaktifkan logging_collector
  • juga pastikan bahwa log_directorydirektori sudah ada di dalam datadirektori, dan bahwa pengguna postgres dapat menulisnya.
Jarret Hardie
sumber
3
Jadi hanya ingin tahu, apakah itu berarti PostgreSQL tidak dapat mengaktifkan logging kecuali saya me-restart server? Di MySQL, sesederhana "SET GLOBAL general_log = 'ON';"
Antony
7
Saya sendiri tidak tahu apakah ada cara untuk melakukannya menggunakan pernyataan SQL seperti MySQL, tetapi Anda dapat mengirim server yang sedang berjalan perintah untuk memuat ulang konfigurasi denganpg_ctl reload
Jarret Hardie
9
PostgreSQL belum memiliki cara untuk mengubah parameternya melalui pernyataan SQL (per 9.2). Sebagian besar parameter logging dapat diubah tanpa server restart penuh, dengan hanya melakukan pg_ctl memuat ulang Namun, dibutuhkan restart untuk mengubah logging_collector.
Greg Smith
6
Dengan Postgres 9.4 dan ALTER SYSTEMperintah baru superuser dapat mengatur params GUC dari SQL.
Erwin Brandstetter
6
The datadirektori dikutip dalam jawabannya adalah bukan nama harfiahnya; ini merujuk pada path yang ditetapkan ke data_directoryvariabel dalam file konfigurasi PostgreSQL. Pada Debian dan Ubuntu GNU / Linux, file ini biasanya berada di /etc/postgresql/$v/main/postgresql.conf, di mana $vversi server. Juga, pada sistem yang disebutkan di atas, kapan log_destination = 'stderr', output ditulis ke /var/log/postgresql/postgresql-$v-main.log, di mana $vversi server (bukan ke beberapa lokasi di dalam data_directory).
Ben Johnson
104

Edit /etc/postgresql/9.3/main/postgresql.conf, dan ubah baris sebagai berikut.

Catatan : Jika Anda tidak menemukan postgresql.conffile, ketik saja $locate postgresql.confterminal

  1. #log_directory = 'pg_log' untuk log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' untuk log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' untuk log_statement = 'all'

  4. #logging_collector = off untuk logging_collector = on

  5. Opsional :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart atau sudo service postgresql restart

  7. Permintaan api di postgresql select 2+2

  8. Temukan login saat ini /var/lib/pgsql/9.2/data/pg_log/

File-file log cenderung tumbuh banyak dari waktu ke waktu, dan mungkin membunuh mesin Anda. Demi keamanan Anda, tulis skrip bash yang akan menghapus log dan memulai kembali server postgresql.

Terima kasih @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani

vijay
sumber
2
Pada bentangan debian, saya juga harus batalkan komentar # log_destination = 'stderr'pada file konfigurasi sebelum ini bekerja.
phihag
Saya telah mengikuti langkah Anda dengan hati-hati dan tidak berhasil. Apakah perlu restart?
Yohanes AI
2
jika Anda tidak ingin menulis skrip bash tetapi hanya ingin log ditimpa setiap bulan, lakukan ini: log_filename = 'postgresql-%d.log'dan tidak ada itu tidak akan ditimpa setelah setiap restart, itu akan menambahkan untuk setiap hari dan menimpa setiap bulan. Tentu saja ada hari yang berbeda tergantung pada bulan 28,29,30,31 - tetapi Anda mendapatkan idenya.
sojim2
44
SELECT set_config('log_statement', 'all', true);

Dengan pengguna yang sesuai, hak dapat menggunakan kueri di atas setelah terhubung. Ini akan memengaruhi pencatatan hingga sesi berakhir.

Rix Beck
sumber
7
Biasanya lebih bersih untuk menggunakan SET log_statement = 'all'atau (untuk tingkat transaksi) SET LOCAL log_statement = 'all'. Anda mungkin juga tertarik dengan client_min_messagesdan log_min_messagespengaturan.
Craig Ringer
1
Ini hebat, karena saya hanya ingin mencatat pesan koneksi saya. Sayangnya saya mengerti: permission denied to set parameter "log_statement"karena pengguna saya bukan pengguna super.
guettli
3
Anda dapat meminta hibah administrator DB untuk menjalankan fungsi. 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

Anda juga perlu menambahkan baris-baris ini di PostgreSQL dan restart server:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Latif Premani
sumber
2
logging_collector = on diperlukan
wjin
Bekerja seperti pesona. Saya bingung dengan komentar pada file konfigurasi yang mengatakan Required to be on for csvlogs, berpikir opsi ini untuk mencatat output query dan bukan hanya pernyataan, tapi bukan itu masalahnya.
Jacopofar
Dalam file data / postgresql.conf Anda, ubah pengaturan log_statement ke 'all'.
FlyingV
32

FYI: Solusi lain hanya akan mencatat pernyataan dari database default — biasanya postgres— untuk mencatat orang lain; mulai dengan solusi mereka; kemudian:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Ref: https://serverfault.com/a/376888 /log_statement

DI
sumber
20

+1 untuk jawaban di atas. Saya menggunakan konfigurasi berikut

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

Hanya untuk memiliki detail lebih lanjut untuk CentOS 6.4 (Red Hat 4.4.7-3) menjalankan PostgreSQL 9.2, berdasarkan instruksi yang ditemukan di halaman web ini :

  1. Set (batalkan komentar) log_statement = 'all'dan log_min_error_statement = errordalam /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Muat ulang konfigurasi PostgreSQL. Bagi saya, ini dilakukan dengan berlari /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Temukan login hari ini /var/lib/pgsql/9.2/data/pg_log/
Zoltán
sumber
4
Anda tidak perlu memulai ulang - pg_ctl reloadcukup, dan tidak mengganggu koneksi. Tidak yakin jawaban ini menambah apa pun yang sudah ada di sini.
Craig Ringer
1
@CraigRinger Terima kasih atas komentarnya, itu fakta yang cukup penting. Saya akan memperbarui jawabannya setelah saya mencoba saran Anda. Saya menulis jawaban ini terutama untuk referensi bagi diri saya sendiri, karena pada saat itu saya memiliki sedikit pengalaman dengan UNIX, dan saya ingin memiliki semua informasi yang diperlukan di satu tempat (misalnya lokasi postgresql.conf dan file log).
Zoltán
0

Anda juga harus mengatur parameter ini untuk mencatat setiap pernyataan:

log_min_duration_statement = 0
H.Ç.T
sumber
0

Saya mencoba mengatur log_statementdi beberapa file konfigurasi postgres tetapi sebenarnya file tersebut tidak dibaca oleh postgres kami.

Saya mengkonfirmasi bahwa menggunakan permintaan:

select *
from pg_settings

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

Saya menggunakan cara ini https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Ser
sumber