PostgreSQL - 限制总日志大小

时间:2018-01-26 08:50:05

标签: postgresql logging

我有一个非常简单的要求 - PostgreSQL日志目录应该有固定的最大大小,例如所有PostgreSQL日志最大10 GB。

可以通过创建固定大小的日志并使用日志轮换来实现(例如,旋转10个日志文件,每个日志文件1 GB)。

我尝试使用PostgreSQL日志记录配置来设置它,但我没有设法实现这一点。问题是“log_truncate_on_rotation”不适用于基于大小的旋转,仅适用于基于时间的旋转。

所以,我的问题是 - 是否可以仅使用PostgreSQL配置实现,或者我必须使用其他东西?如果没有,为什么PostgreSQL没有这个功能?

我的选择很少:

  • 使用“log_rotation_size”属性将最大文件大小设置为1 GB,然后设置CRON作业,如果文件数超过10,将删除最旧的文件
  • 使用logrotate实用程序,但我必须每天执行一次以上

2 个答案:

答案 0 :(得分:1)

是的 - 你没有这样的功能你是对的 - 你需要一个cron

https://www.postgresql.org/docs/current/static/runtime-config-logging.html

  

log_truncate_on_rotation(boolean)

     

启用logging_collector时,此参数将导致   PostgreSQL截断(覆盖),而不是追加,任何   现有的同名日志文件。但是,会发生截断   仅当由于基于时间的轮换而打开新文件时,不会   在服务器启动或基于大小的轮换期间

你可以设置甚至是微不足道的工作来检查日志量:

* * * * * rm $(ls -t /PGDATA/pg_log/* | tail -n 1)

答案 1 :(得分:0)

除了别人说的话,我建议不要重新发明轮子。

Logrot通常由cron调用,即使每分钟运行它也不是一个好主意,如果你有postgres日志大小问题,你可以添加一个额外的cron条目,根据日志dir大小有条件地执行它或自由空间(如您所愿)。

关注自由空间:

数据:

joanmi@alpha:~$ sudo df -h /var/log/postgresql
S. fitxers                    Mida En ús Lliure  %Ús Muntat a
/dev/mapper/kubuntu--vg-root  229G  131G    87G  61% /

取货:

joanmi@alpha:~$ sudo df -h /var/log/postgresql | tail -n 1 | cut -d ' ' -f 5
131G

关注已用空间:

  

请注意,这是更昂贵的计算。   这对我来说足够快,因为我没有大数据库   机器(它只是我的工作站)。

数据:

joanmi@alpha:~$ sudo du -sh /var/log/postgresql/
76K     /var/log/postgresql/

取货:

joanmi@alpha:~$ sudo du -sh /var/log/postgresql/ | cut -f 1
76K

最后......

用户可读性较低(但在脚本中更容易比较):

joanmi@alpha:~$ sudo df /var/log/postgresql | tail -n 1 | cut -d ' ' -f 5
137003128

joanmi@alpha:~$ sudo du -s /var/log/postgresql/ | cut -f 1
76
  

注意:我使用sudo来避免权限问题。   在根cron作业中,它可以被删除。

示例:

关于自由空间:

这不输出任何内容(如果你至少有100k免费):

[[ \
    $(df /var/log/postgresql | tail -n 1 | cut -d ' ' -f 5) \
    -gt 100 \
]] \
    || echo 'Logrotate should be performedd!!'

这会输出Logrotate should be performedd!!(除非你有一个非常大的磁盘; - )):

[[ \
    $(df /var/log/postgresql | tail -n 1 | cut -d ' ' -f 5) \
    -gt 100000000000000000000 \
]] \
    || echo 'Logrotate should be performedd!!'