Можно ли исключить конкретных пользователей в журнале активности PostgreSQL?

10

Мне нужно следить за активностью пользователей в наших базах. Я установил следующие параметры в postgresql.conf:

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

Однако я понимаю, что большинство файлов журнала заполнены инструкциями, выполняемыми postgresпользователем, которые используются сценариями, которые я написал для задач обслуживания: пересчитать материализованные представления, pg_dump, pg_restore, извлечь представления в виде табличных файлов и т. Д. Результат ежедневно файлы журналов размером более 12 Мб.

Есть ли способ исключить активность определенных пользователей из журнала?

Себастьян Климент
источник
3
IIRC ALTER USER ... SET log_connections = offи т. Д.
Крейг Рингер
Отлично, я сделаю это.
Себастьян Клеман
1
@CraigRinger вошел как dezso(суперпользователь), я всегда получаю ERROR: parameter "log_connections" cannot be set after connection startпри попыткеALTER ROLE bob SET log_connections = off
dezso
@dezso Drat. Часть того, почему я прошел квалификацию в IIRC ... не был уверен.
Крейг Рингер
1
@CraigRinger Я попробовал это вчера, думая, что это возможно, - тогда поставил вопрос: D
dezso 15.10.15

Ответы:

5

Используя ALTER ROLE ... SET parameter;команду, можно было настроить параметры журнала, специфичные для пользователя. Обратите внимание, что параметр вступает в силу только после выхода из системы.

Установка log_min_duration_statement = -1 (первый вход в систему):

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

Результат в журнале:

Обратите внимание, что в этом сеансе все операторы видны в журнале даже после установки 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

Видя эффект log_min_duration_statement (2-й вход):

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

Результат в журнале:

Как и ожидалось, ни одно из утверждений не вошли.

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
Себастьян Климент
источник