CentOS 上 PostgreSQL 日志管理
一 日志位置与查看
tail -f /var/log/postgresql/postgresql-*.log 或 tail -f $PGDATA/pg_log/*.logless $PGDATA/pg_log/postgresql-2025-12-05_*.loggrep -i "error" $PGDATA/pg_log/*.log二 核心配置与生效方式
logging_collector = on(开启后日志写入文件;关闭时依赖 syslog/stderr)log_destination = 'stderr,csvlog'(同时输出可读文本与 CSV 便于分析)log_directory = 'pg_log'(相对 $PGDATA)或 log_directory = '/var/log/postgresql'log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'log_rotation_age = 1d(按天轮转)log_rotation_size = 20MB(按大小轮转)log_truncate_on_rotation = off(同名文件是否截断)log_connections = on、log_disconnections = onlog_statement = 'ddl'|'mod'|'all'(按需开启,记录 DDL、DML 或全部语句)log_min_duration_statement = 500(单位毫秒,记录超过阈值的慢 SQL)log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '(包含时间、进程、会话、用户、库)ALTER SYSTEM SET parameter = 'value'; SELECT pg_reload_conf();logging_collector 从 off→on):systemctl restart postgresql-<版本号>。三 日志轮转与归档
log_rotation_age 与 log_rotation_size 控制按时间/大小切割,适合大多数单机场景。/var/log/postgresql/*.log {
daily
rotate 30
compress
missingok
notifempty
create 0640 postgres postgres
sharedscripts
postrotate
/usr/bin/pg_ctl reload -D /var/lib/pgsql/12/data >/dev/null 2>&1 || true
endscript
}
postgresql-<版本号> 替换为你的实际服务名;reload 触发日志句柄重新打开,避免切割失败。compress 与 rotate N 保留策略,或将归档目录通过 rsync/scp 同步至远程存储/备份系统。四 分析与可视化
csvlog 后,可用 file_fdw 将日志映射为外部表,直接在数据库中查询分析:CREATE EXTENSION IF NOT EXISTS file_fdw;
CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE pglog (
log_time timestamp(3),
user_name text,
database_name text,
process_id integer,
remote_host text,
remote_port integer,
session_id text,
command_tag text,
session_line_num bigint,
log_level text,
message text
)
SERVER pglog
OPTIONS (filename '/var/lib/pgsql/12/data/pg_log/*.csv', format 'csv');
五 生产实践与安全建议
log_statement = 'all',优先使用 mod 或配合 log_min_duration_statement 捕获慢 SQL。log_rotation_size(如 10–50MB)与 log_rotation_age(如 1d),既控体积又便于排障。lc_messages = 'UTF8'(需重启),确保日志与系统环境一致。log_connections、log_disconnections 与关键 DDL 记录,满足等保/内审要求。