Ist es möglich, bestimmte Benutzer in der Protokollaktivität von PostgreSQL auszuschließen?

10

Ich muss die Aktivität der Benutzer in unseren Datenbanken überwachen. Ich habe folgende Parameter eingestellt in postgresql.conf:

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

Mir ist jedoch klar, dass die meisten Protokolldateien mit vom postgresBenutzer ausgeführten Anweisungen gefüllt sind , die von Skripten verwendet werden, die ich für Wartungsaufgaben geschrieben habe: Neuberechnung materialisierter Ansichten, pg_dump, pg_restore, Extrahieren von Ansichten als tabellarische Dateien usw. Das Ergebnis ist täglich Protokolldateien mit einer Größe von über 12 MB.

Gibt es eine Möglichkeit, die Aktivität bestimmter Benutzer aus dem Protokoll auszuschließen?

Sébastien Clément
quelle
3
IIRC ALTER USER ... SET log_connections = offusw.
Craig Ringer
Genial, das mache ich.
Sébastien Clément
1
@CraigRinger angemeldet als dezso(ein Superuser), bekomme ich immer, ERROR: parameter "log_connections" cannot be set after connection startwenn ich versucheALTER ROLE bob SET log_connections = off
dezso
@dezso Drat. Ein Teil der Gründe, warum ich mich für IIRC qualifiziert habe ... war nicht sicher.
Craig Ringer
1
@CraigRinger Ich habe es gestern versucht, weil ich dachte, es sei möglich - dann habe ich die Frage
positiv

Antworten:

5

Mit dem ALTER ROLE ... SET parameter;Befehl konnten benutzerspezifische Protokollparameter angepasst werden. Beachten Sie, dass der Parameter erst nach dem Abmelden wirksam wird.

Festlegen von log_min_duration_statement = -1 (1. Login):

psql konsole

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

Ergebnis im Protokoll:

Beachten Sie, dass innerhalb dieser Sitzung alle Anweisungen im Protokoll sichtbar sind, auch nachdem log_min_duration_statement = -1 festgelegt wurde.

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

Anzeigen der Auswirkung von log_min_duration_statement (2. Anmeldung):

psql konsole

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

Ergebnis im Protokoll:

Wie erwartet wird keine der Anweisungen protokolliert.

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
quelle