Linux logrotate配置PostgreSQL日志未按10KB阈值轮转问题排查
PostgreSQL日志logrotate未触发轮转的排查方案
问题定位
调试模式(logrotate -d)显示满足轮转条件,但实际未执行,说明轮转逻辑本身无问题,问题出在执行触发机制、权限或配置细节上。
逐一排查项
1. 确认logrotate是否自动加载你的配置文件
系统默认的logrotate cron任务(通常在/etc/cron.daily/logrotate)只会扫描/etc/logrotate.d/目录下的配置文件。如果你的logrotate_PostgreSQL.conf放在/etc/根目录,cron不会自动执行它:
- 解决:要么把配置文件移到
/etc/logrotate.d/,要么在/etc/logrotate.conf中添加:include /etc/logrotate_PostgreSQL.conf
2. 验证权限与执行上下文
- cron中的logrotate一般以root运行,需确保root对
/var/log/PG/目录(至少rwxr-xr-x权限)、postgres.log文件(读写权限)、配置文件(读权限)有足够权限。 - 若启用SELinux,用
ls -Z /var/log/PG/postgres.log检查日志文件上下文,需为var_log_t类可写类型,否则logrotate无法修改文件。
3. 检查logrotate状态文件
logrotate会在/var/lib/logrotate.status(部分发行版为/var/lib/logrotate/logrotate.status)记录上次轮转时间:
- 搜索你的日志路径,若记录的时间异常(比如远早于当前时间但未轮转),可删除状态文件(下次执行会自动重建),或手动强制轮转测试:
执行后查看su postgres -c '/usr/sbin/logrotate -f /etc/logrotate_PostgreSQL.conf'/var/log/PG/是否生成postgres.log.1。
4. 完善logrotate配置的关键参数
确保配置包含适配PostgreSQL日志写入的参数:
/var/log/PG/postgres.log { size 10K rotate 10 copytruncate su postgres postgres }
copytruncate:复制日志内容到归档文件后截断原文件,避免PostgreSQL持有旧文件句柄导致日志继续写入归档。su postgres postgres:指定以postgres用户执行轮转,规避权限冲突。
5. 查看系统日志找报错
搜索/var/log/messages或/var/log/syslog中的logrotate相关条目,排查是否有权限不足、路径不存在等报错信息。
快速验证流程
- 先执行强制轮转命令,确认配置能生成归档日志
- 检查配置文件是否被cron任务加载
- 核对权限与SELinux上下文
- 从状态文件和系统日志定位执行异常原因
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

