PostgreSQL的日志配置主要通过/etc/postgresql/{version}/main/postgresql.conf文件完成,核心参数如下:
logging_collector:设置为on以启用日志收集器(默认关闭),负责将日志输出到文件而非标准错误。log_directory:指定日志存储目录(如pg_log,相对于数据目录/var/lib/postgresql/{version}/main),需确保PostgreSQL用户对该目录有写入权限。log_filename:定义日志文件命名模式(如postgresql-%Y-%m-%d_%H%M%S.log),支持日期和时间占位符,便于按时间分割日志。log_min_messages:设置日志记录级别(可选debug5到panic),常用info(记录常规信息)或notice(记录重要事件)。log_min_duration_statement:记录执行时间超过指定毫秒数的SQL语句(如1000表示记录慢查询,单位:毫秒),用于性能分析。log_statement:记录特定类型的SQL语句(如mod记录修改数据的SQL,all记录所有SQL),需谨慎使用以避免日志过大。修改配置文件后,需重启PostgreSQL服务使更改生效:
sudo systemctl restart postgresql
默认情况下,日志文件存储在/var/log/postgresql/目录下,文件名格式为postgresql-{version号}-{instance_name}.log(如postgresql-15-main.log)。
使用tail命令实时查看日志文件的最后N行(如最后100行):
tail -n 100 /var/log/postgresql/postgresql-15-main.log
若需持续监控新增日志,可使用-f参数:
tail -f /var/log/postgresql/postgresql-15-main.log
通过grep命令过滤日志中的关键词(如ERROR、FATAL、PANIC),快速定位错误信息:
grep -i "error\|fatal\|panic" /var/log/postgresql/postgresql-15-main.log
若启用了log_min_duration_statement,可通过grep提取慢查询记录:
grep "duration" /var/log/postgresql/postgresql-15-main.log
Debian系统默认使用logrotate工具管理PostgreSQL日志轮转,配置文件位于/etc/logrotate.d/postgresql。示例配置如下:
/var/log/postgresql/postgresql-15-main.log {
daily # 每天轮转一次
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(使用gzip)
delaycompress # 延迟压缩(避免压缩当天日志)
missingok # 若日志文件不存在也不报错
notifempty # 若日志为空则不轮转
create 640 root adm # 创建新日志文件并设置权限
}
修改配置后,logrotate会自动按计划执行(通常每日一次),无需手动干预。
若需立即轮转日志,可调用PostgreSQL的pg_rotate_logfile()函数(需超级用户权限):
SELECT pg_rotate_logfile();
pgBadger是一款强大的PostgreSQL日志分析工具,可生成HTML格式的详细报告,帮助识别性能瓶颈、慢查询等问题。
通过Debian包管理器安装:
sudo apt-get install pgbadger
运行以下命令生成报告(假设日志文件为postgresql-15-main.log):
pgbadger /var/log/postgresql/postgresql-15-main.log -o report.html
使用浏览器打开生成的report.html文件,即可查看查询统计、慢查询、锁等待等信息。
EXPLAIN ANALYZE分析查询计划并添加索引。