Linux上的自由空间驱动日志轮换?


8

有人问我“我们的应用程序日志应该保留多长时间”,我的回答是“直到磁盘已满”,因为除了空间不足之外,没有其他理由丢弃它们。

但是,标准logrotate希望我们指定一个特定的期间+旋转数。是否有类似的东西会让我们说“每天轮换,并保留尽可能多的历史记录,直到只有5%的空间可用”?

该平台是Redhat Linux。


1
可以在物理环境上应用将日志保留到磁盘满的情况,但是由于我们主要转移到虚拟服务器和云,因此文件系统的大小应尽可能小以降低成本。在这种情况下,您无法避免定义保留策略。
jfg956 2012年

Answers:


9

您也许可以使用firstaction或lastaction指令调用测试磁盘可用空间的Shell脚本,然后对最早的文件运行删除操作。

   firstaction/endscript
          The lines between firstaction and endscript (both of which must appear on lines by themselves) are
          executed (using /bin/sh) once before all log files that match the wildcarded pattern are  rotated,
          before  prerotate  script  is  run  and  only if at least one log will actually be rotated.  These
          directives may only appear inside a log file definition. Whole pattern is passed to the script  as
          first  argument.  If  the script exits with error, no further processing is done. See also lastac-
          tion.

更新:

这是有关您可以运行的脚本类型的Stackoverflow帖子:

/programming/7523059/remove-oldest-file-in-repository


1

logrotate本身没有这种选择。您可以添加一个cron脚本,该脚本可以找到最旧的日志,以在可用空间低于您的标准时将其删除。您也可以进行其他验证。但是,始终使磁盘太满不是一个好主意,因为系统将无法创建较大的临时文件,并且可能导致应用程序故障。


如果所有内容都放在一个文件系统上,那可能不是一个好主意。但是,我的日志位于自己的文件系统中,以避免造成其他问题。
kdt 2012年

嗯,如果他们只有fs,那么使用脚本执行清理,dh / fs并使用awk或cut来提取已用%的过程就很简单,根据该图,您可以使用exec开始查找R M。我通常不编写脚本,而只是在crontab本身中添加一个衬里。
johnshen64 2012年

0

我只是想指出,在某些情况下,您不希望日志填充所有可用的磁盘空间。我已经用精简配置的/ var目录处理了几台主机,并且将日志保持在一定大小是至关重要的。我们将cronies作业与logrorate结合使用以减小尺寸。在您的环境中可以使用类似的方法,尽管像splunk或syslog-ng这样的中央日志服务器可能是更好的选择。


0

正如@cjc建议的那样,您可以使用firstaction。请参阅以下示例:

/mnt/user/logs/*.log  /mnt/user/logs/*/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        su root www-data
        create 760 root www-data
        firstaction
          for file in `find  -type f -size +1024M`; do
              percent=`df -h | grep /mnt/user | awk '{print $5}' | sed 's/%//'`
              if [ $percent -gt 50 ]; then 
                  echo "Removed $file" >> /mnt/user/logs/logrotate.log
                  rm $file
              fi
           done;
        endscript
}

在此示例中,如果分区使用的空间大于50%,则从/ mnt / user分区中删除大于1GB的文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.