我安装了
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'但是,我希望通过日志旋转来管理日志轮转,而不是通过PostgreSQL来管理内部日志轮转:
#vim /etc/logrotate.d/postgresql
/var/lib/pgsql/data/log/postgresql.log {
daily
rotate 7
compress
create 0664 postgres postgres
missingok
notifempty
sharedscripts
}但是PostgreSQL将停止登录到旋转的/var/lib/pgsql/data/log/postgresql.log文件中。唯一的解决方案是systemctl restart postgresql,它可以放置在log旋转式postrotate/endscript块中,但是如果在关键的生产系统上这样做,我就不能这样做。
您有什么建议吗?如何正确地日志旋转PostgreSQL日志文件而不需要重新启动PostgreSQL?
谢谢!
更新:在重新加载PostgreSQL期间,它会查找更改。我找到了一个如何实现PostgreSQL将开始登录到旋转的postgresql.log文件的解决方案--我需要修改配置文件,例如注释掉/修改log_filename,然后重新加载PostgreSQL,并将更改还原回PostgreSQL并重新加载PostgreSQL。因为PostgreSQL查找配置文件中的更改。但是,如果还有比触摸配置文件更好的解决方案,我会很高兴的。
发布于 2019-10-24 08:56:49
这是我使用sed的实际解决方法:
/var/lib/pgsql/data/log/postgresql*.log {
daily
rotate 7
compress
delaycompress
create 0664 postgres postgres
missingok
notifempty
sharedscripts
prerotate
sed -i "s/log_filename = 'postgresql.log' # log file name pattern,/log_filename = 'postgresql_rotate.log' # log file name pattern,/" /var/lib/pgsql/data/postgresql.conf
systemctl reload postgresql
sleep 1
endscript
postrotate
sed -i "s/log_filename = 'postgresql_rotate.log' # log file name pattern,/log_filename = 'postgresql.log' # log file name pattern,/" /var/lib/pgsql/data/postgresql.conf
systemctl reload postgresql
endscript
}何地线
log_filename = 'postgresql.log' # log file name pattern,将临时重命名为postgresql_rotate.log,重新加载PostgreSQL,然后将日志文件重命名为postgresql.log,然后再重新加载PostgreSQL。
延迟压缩是因为postgresql_rotate.log需要适当地旋转临时旋转日志文件。如果我们只是注释掉,log_filename PostgreSQL将创建按实际时间命名的日志文件,这是永远不会旋转的,因为它会更改每次旋转的名称。因此,前两个文件将保持未压缩和所有其他压缩。
如果你能找到更好的解决办法,我会很高兴的。
发布于 2020-01-10 13:51:03
如果您能够接受丢失日志数据的小风险,您可以尝试使用log旋转式的copytruncate指令。
发布于 2019-10-24 06:26:21
PostgreSQL打开了旧的日志文件,并一直向它写入。重命名文件不会改变这一点。
尝试添加一个调用postrotate命令
pg_ctl reload -D /path/to/datadir或者用其他方式向邮递员发送信号1。
https://dba.stackexchange.com/questions/251784
复制相似问题