我需要监控我们数据库中用户的活动。我在中设置了以下参数postgresql.conf
:
log_min_duration_statement = 0
log_connections = on
log_disconnections = on
log_line_prefix = '%t %a %d %h %u |'
Run Code Online (Sandbox Code Playgroud)
但是,我意识到大多数日志文件都填充了postgres
用户执行的语句,这些语句被我为维护任务编写的脚本所使用:重新计算物化视图、pg_dump、pg_restore、将视图提取为列表文件等。结果是每天日志文件大小超过 12 Mb。
有没有办法从日志中排除特定用户的活动?
使用该ALTER ROLE ... SET parameter;
命令,可以定制用户特定的日志参数。注意该参数只有在注销后才生效。
控制台
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
Run Code Online (Sandbox Code Playgroud)
日志上的结果:
请注意,在该会话中,即使在设置 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
Run Code Online (Sandbox Code Playgroud)
控制台
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
Run Code Online (Sandbox Code Playgroud)
日志上的结果:
正如预期的那样,没有记录任何语句。
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
Run Code Online (Sandbox Code Playgroud)