É possível excluir usuários específicos na atividade de log do PostgreSQL?

10

Eu preciso monitorar a atividade dos usuários em nossos bancos de dados. Eu configurei os seguintes parâmetros em postgresql.conf:

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

No entanto, percebo que a maioria dos arquivos de log é preenchida com instruções executadas pelo postgresusuário, que são usadas pelos scripts que eu escrevi para tarefas de manutenção: recalcular visualizações materializadas, pg_dump, pg_restore, extrai visualizações como arquivos tabulados, etc. O resultado é diário arquivos de log com mais de 12 Mb de tamanho.

Existe uma maneira de excluir a atividade de usuários específicos do log?

Sébastien Clément
fonte
3
IIRC ALTER USER ... SET log_connections = offetc.
Craig Ringer
Brilhante, eu vou fazer isso.
Sébastien Clément
11
@CraigRinger logado como dezso(um superusuário), eu sempre chegar ERROR: parameter "log_connections" cannot be set after connection startao tentarALTER ROLE bob SET log_connections = off
Dezso
@dezso Drat. Parte do motivo pelo qual me classifiquei no IIRC ... não tinha certeza.
Craig Ringer
11
@CraigRinger Eu tentei isso ontem, pensando que era possível -, então upvoted a pergunta: D
Dezso

Respostas:

5

Usando o ALTER ROLE ... SET parameter;comando, foi possível adaptar parâmetros de log específicos do usuário. Observe que o parâmetro só entra em vigor após o logout.

Configurando log_min_duration_statement = -1 (1º login):

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

Resultado no log:

Observe que nessa sessão, todas as instruções são visíveis no log, mesmo após a configuração de 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

Vendo o efeito de log_min_duration_statement (2º login):

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

Resultado no log:

Como esperado, nenhuma das instruções é registrada.

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
fonte