如何在PostgreSQL日志写入磁盘前排除Patroni及PostgreSQL应用日志?
没问题!完全可以在PostgreSQL把日志写到磁盘之前就过滤掉Patroni和自身的操作日志,不用事后再去筛。下面给你两种实用的方案,按需选就行:
方案一:用Syslog + Rsyslog过滤(推荐)
这种方法借助系统的syslog服务做前置过滤,稳定性很高,是我比较推荐的方式:
- 先修改PostgreSQL的配置文件
postgresql.conf,确保日志里会标记出每个连接的应用名称:log_destination = 'syslog' syslog_facility = 'local0' syslog_ident = 'postgres' # 关键是在日志前缀里加上app=%a,这样每条日志都会带应用名称 log_line_prefix = '%t [%p]: [%c-%l] user=%u,db=%d,app=%a ' - 重启PostgreSQL让配置生效,比如执行
sudo systemctl restart postgresql。 - 配置Rsyslog来过滤日志:
在/etc/rsyslog.d/目录下新建一个postgres-filter.conf文件,写入以下规则:
这里的# 丢弃Patroni的日志 :msg, contains, "app=Patroni" ~ # 丢弃PostgreSQL自身后台进程的日志(比如postgres用户启动的系统进程) :msg, contains, "app=postgres" ~ # 如果还有其他PostgreSQL自带进程需要过滤,比如autovacuum,也加上 :msg, contains, "app=autovacuum" ~ # 剩下的日志写入指定文件 local0.* /var/log/postgresql/postgresql-filtered.log~符号表示“丢弃匹配到的日志”,只有没被匹配到的日志才会被写入磁盘。 - 最后重启rsyslog服务:
sudo systemctl restart rsyslog
方案二:用自定义脚本通过管道过滤
如果不想依赖syslog,也可以让PostgreSQL把日志输出到一个管道,用脚本实时过滤后再写入文件:
- 修改
postgresql.conf的日志相关配置:log_destination = 'pipe' # 指定管道执行的脚本路径 pipe_command = '/usr/local/bin/postgres-log-filter.sh' # 确保日志目录权限正确 log_directory = '/var/log/postgresql' - 创建过滤脚本
/usr/local/bin/postgres-log-filter.sh,内容如下:#!/bin/bash # 过滤掉包含指定应用名称的日志行,剩下的写入目标文件 grep -v -E 'app=Patroni|app=postgres|app=autovacuum' >> /var/log/postgresql/postgresql-filtered.log - 给脚本添加执行权限:
sudo chmod +x /usr/local/bin/postgres-log-filter.sh - 确保PostgreSQL用户(通常是postgres)对日志文件有读写权限:
sudo touch /var/log/postgresql/postgresql-filtered.log sudo chown postgres:postgres /var/log/postgresql/postgresql-filtered.log - 重启PostgreSQL生效。
小提示
- 先通过
SELECT application_name FROM pg_stat_activity;确认Patroni和PostgreSQL自身进程的应用名称,确保过滤的字符串完全匹配,避免漏过滤或者误过滤。 - 方案一的syslog方式更可靠,如果过滤脚本崩溃,管道方案可能导致PostgreSQL无法写入日志,而syslog的容错性更好。
内容的提问来源于stack exchange,提问作者parasit
相关产品推荐
相关产品推荐

