我已经安装
PostgreSQL 10.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 8.2.1 20180905 (Red Hat 8.2.1-3), 64-bit
并配置:
log_filename = 'postgresql.log'
但我想通过 logrotate 而不是 PostgreSQL 的内部 logrotation 来管理日志轮换:
#vim /etc/logrotate.d/postgresql
/var/lib/pgsql/data/log/postgresql.log {
daily
rotate 7
compress
create 0664 postgres postgres
missingok
notifempty
sharedscripts
}
logrotate 按预期工作,但 PostgreSQL 将停止登录到旋转/var/lib/pgsql/data/log/postgresql.log
文件。唯一的解决方案是systemctl restart postgresql
可以放在 logrotatepostrotate/endscript
块内,但如果这是在关键生产系统上完成的,我不能这样做。
你有什么建议如何在不需要重新启动 PostgreSQL 的情况下正确地 logrotate PostgreSQL 日志文件?
谢谢!
更新: 在重新加载 PostgreSQL 期间,它会查找更改。我找到了一种解决方法,如何实现 PostgreSQL 将开始登录到旋转的postgresql.log文件 - 我需要修改配置文件,例如注释掉/修改log_filename然后重新加载 PostgreSQL 并恢复更改并再次重新加载 PostgreSQL。因为 PostgreSQL 在配置文件中寻找变化。但如果有比触摸配置文件更好的解决方案,我会很高兴。
如果您可以接受丢失日志数据的小风险,您可以尝试使用logrotate
copytruncate
指令。PostgreSQL 打开旧的日志文件并继续写入。重命名文件不会改变这一点。
尝试添加一个
postrotate
调用的命令或使用其他方式向邮局局长发送信号 1。
这是我使用sed的实际解决方法:
哪里行
将暂时重命名为postgresql_rotate.log,重新加载 PostgreSQL 并在将日志文件重命名回postgresql.log之后再次重新加载 PostgreSQL。
delaycompress之所以存在,是因为postgresql_rotate.log需要在那里正确旋转临时旋转日志文件。如果我们只注释掉log_filename PostgreSQL 将创建以实际时间命名的日志文件,并且这永远不会轮换,因为它每次轮换都会更改名称。因此,前 2 个文件将保持未压缩,所有其他文件将被压缩。
如果您能找到更好的解决方案,我会很高兴。