![postgres 内部日志轮换机制可以删除超过一定时间的日志文件吗?](https://linux22.com/image/566316/postgres%20%E5%86%85%E9%83%A8%E6%97%A5%E5%BF%97%E8%BD%AE%E6%8D%A2%E6%9C%BA%E5%88%B6%E5%8F%AF%E4%BB%A5%E5%88%A0%E9%99%A4%E8%B6%85%E8%BF%87%E4%B8%80%E5%AE%9A%E6%97%B6%E9%97%B4%E7%9A%84%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E5%90%97%EF%BC%9F.png)
我正在使用 posgtres 的内部日志轮换机制。我想删除超过 30 天的日志文件。我该如何让 postgres 执行此操作?如果 postgres 不支持,我可以将 logrotate 设置为仅删除超过 30 天的日志吗?
我当前的配置是:
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
#log_truncate_on_rotation = off
log_rotation_age = 1440
log_rotation_size = 0
答案1
我不相信 Postgres 日志机制支持这种清理,但只要您不弄乱 Postgres 正在写入的活动日志文件,使用 logrotate 或 cron 作业删除旧日志是完全安全的。
对于 Postgres 日志记录,我通常更喜欢将日志记录到 syslog 并让常规日志轮换程序发挥作用。这有几个优点,但最大的两个优点是能够像使用其他守护程序一样使用标准日志轮换程序(如 logrotate),并且能够让 syslog 守护程序将日志发送到远程主机(如果您将来想这样做的话)。
讨论了其他选项(尽管很简短)在 Postgres 手册的第 23.3 节中。
答案2
如果您不使用 syslog,那么您可以从 cron 运行以下脚本并结束一天的工作。
#!/bin/sh
HOME=/var/lib/pgsql
export HOME
PGDATA=/var/lib/pgsql/9.1/data
export PGDATA
/usr/bin/find $PGDATA/pg_log -type f -ctime +30 -name "*.log" -exec /bin/rm {} \;
通过不记录到系统日志,您还可以使用 pgAdmin 或 pgFouine 等工具来查看/分析数据库日志。