Apakah mungkin untuk mengecualikan pengguna tertentu dalam aktivitas log PostgreSQL?

10

Saya perlu memantau aktivitas pengguna di basis data kami. Saya telah menetapkan parameter berikut di postgresql.conf:

log_min_duration_statement = 0
log_connections = on
log_disconnections = on
log_line_prefix = '%t %a %d %h %u |'

Namun, saya menyadari bahwa sebagian besar file log diisi dengan pernyataan yang dijalankan oleh postgrespengguna, yang digunakan oleh skrip yang saya tulis untuk tugas pemeliharaan: menghitung ulang tampilan terwujud, pg_dump, pg_restore, mengekstraksi tampilan sebagai file yang ditabulasi, dll. Hasilnya setiap hari file log memiliki ukuran lebih dari 12 Mb.

Apakah ada cara untuk mengecualikan aktivitas pengguna tertentu dari log?

Sébastien Clément
sumber
3
IIRC ALTER USER ... SET log_connections = offdll.
Craig Ringer
Cemerlang, aku akan melakukannya.
Sébastien Clément
1
@CraigRinger masuk sebagai dezso(pengguna super ), saya selalu mengerti ERROR: parameter "log_connections" cannot be set after connection startketika mencobaALTER ROLE bob SET log_connections = off
dezso
@dezso Drat. Bagian dari mengapa saya memenuhi syarat dengan IIRC ... tidak yakin.
Craig Ringer
1
@CraigRinger Saya sudah mencoba ini kemarin, berpikir itu mungkin - kemudian mengangkat pertanyaan: D
dezso

Jawaban:

5

Menggunakan ALTER ROLE ... SET parameter;perintah, dimungkinkan untuk menyesuaikan parameter log khusus pengguna. Perhatikan bahwa parameter hanya berlaku setelah keluar.

Pengaturan log_min_duration_statement = -1 (Login pertama):

konsol psql

P:\>psql -U postgres -h 132.156.208.45 -d my_db

my_db=# SHOW log_min_duration_statement;
 log_min_duration_statement
----------------------------
 0
(1 ligne)

my_db=# SELECT COUNT(*) FROM organisms;
 count
-------
   153
(1 ligne)

my_db=# ALTER ROLE postgres SET log_min_duration_statement=-1;
ALTER ROLE

my_db=# SHOW log_min_duration_statement;
 log_min_duration_statement
----------------------------
 0
(1 ligne)

my_db=# SELECT COUNT(*) FROM mv_rings;
 count
--------
 115270
(1 ligne)

my_db=# \q

Hasil pada log:

Perhatikan bahwa dalam sesi itu, semua pernyataan terlihat di log bahkan setelah pengaturan log_min_duration_statement = -1.

2015-10-15 14:14:01 EDT [unknown] my_db 123.456.789.012 postgres |LOG:  connection authorized: user=postgres database=my_db
2015-10-15 14:14:08 EDT psql my_db 123.456.789.012 postgres |LOG:  duration: 0.000 ms  statement: SHOW log_min_duration_statement;
2015-10-15 14:15:26 EDT psql my_db 123.456.789.012 postgres |LOG:  duration: 32.000 ms  statement: SELECT COUNT(*) FROM organisms;
2015-10-15 14:15:45 EDT psql my_db 123.456.789.012 postgres |LOG:  duration: 31.000 ms  statement: ALTER ROLE postgres SET log_min_duration_statement=-1;
2015-10-15 14:16:08 EDT psql my_db 123.456.789.012 postgres |LOG:  duration: 0.000 ms  statement: SHOW log_min_duration_statement;
2015-10-15 14:17:10 EDT psql my_db 123.456.789.012 postgres |LOG:  duration: 2059.000 ms  statement: SELECT COUNT(*) FROM mv_rings;
2015-10-15 14:17:29 EDT psql my_db 123.456.789.012 postgres |LOG:  disconnection: session time: 0:03:27.450 user=postgres database=my_db host=123.456.789.012 port=65269

Melihat efek log_min_duration_statement (login kedua):

konsol psql

P:\>psql -U postgres -h 132.156.208.45 -d my_db

my_db=# SHOW log_min_duration_statement;
 log_min_duration_statement
----------------------------
 -1
(1 ligne)

my_db=# SELECT COUNT(*) FROM germplasms;
 count
--------
 475290
(1 ligne)

my_db=# \q

Hasil pada log:

Seperti yang diharapkan, tidak ada pernyataan yang dicatat.

2015-10-15 14:17:44 EDT [unknown] my_db 123.456.789.012 postgres |LOG:  connection authorized: user=postgres database=my_db
2015-10-15 14:20:27 EDT psql my_db 123.456.789.012 postgres |LOG:  disconnection: session time: 0:02:43.333 user=postgres database=my_db host=123.456.789.012 port=49372
Sébastien Clément
sumber