Est-il possible d'exclure des utilisateurs spécifiques dans l'activité de journalisation de PostgreSQL?

10

J'ai besoin de surveiller l'activité des utilisateurs dans nos bases de données. J'ai défini les paramètres suivants dans postgresql.conf:

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

Cependant, je me rends compte que la plupart des fichiers journaux sont remplis d'instructions exécutées par l' postgresutilisateur, qui sont utilisées par les scripts que j'ai écrits pour les tâches de maintenance: recalculer les vues matérialisées, pg_dump, pg_restore, extraire les vues sous forme de fichiers tabulés, etc. Le résultat est quotidien fichiers journaux de plus de 12 Mo.

Existe-t-il un moyen d'exclure une activité d'utilisateurs spécifiques du journal?

Sébastien Clément
la source
3
IIRC ALTER USER ... SET log_connections = offetc.
Craig Ringer
Brillant, je vais le faire.
Sébastien Clément
1
@CraigRinger connecté en tant que dezso(super-utilisateur), je reçois toujours ERROR: parameter "log_connections" cannot be set after connection starten essayant deALTER ROLE bob SET log_connections = off
dezso
@dezso Drat. Une partie de la raison pour laquelle je me suis qualifié avec l'IIRC ... n'était pas sûre.
Craig Ringer
1
@CraigRinger J'ai essayé cela hier, pensant que c'était possible - puis j'ai voté pour la question: D
dezso

Réponses:

5

À l'aide de la ALTER ROLE ... SET parameter;commande, il a été possible de personnaliser les paramètres de journal spécifiques à l'utilisateur. Notez que le paramètre ne prend effet qu'après déconnexion.

Définition de log_min_duration_statement = -1 (1ère connexion):

console 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

Résultat sur le journal:

Notez que dans cette session, toutes les instructions sont visibles dans le journal même après avoir défini 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

Voir l'effet de log_min_duration_statement (2e connexion):

console 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

Résultat sur le journal:

Comme prévu, aucune des instructions n'est enregistrée.

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
la source