82

我们使用 logrotate 并且它每天都运行......现在我们遇到了一些日志显着增长(阅读:gigbaytes)并杀死我们的服务器的情况。所以现在我们想为日志设置一个最大文件大小......

我可以将它添加到 logrotate.conf 中吗?

尺寸 50M

然后它会适用于所有日志文件吗?还是我需要在每个日志的基础上进行设置?

或者有什么其他建议?

(ps。我知道如果您想收到通知,日志会像描述的那样增长,而我们想要做的并不理想 - 但总比因为没有可用空间而无法登录要好)

谢谢,肖恩

4

2 回答 2

118

正如 Zeeshan 所述,logrotate 选项sizeminsizemaxsize是旋转的触发器。

为了更好地解释它。您可以随意运行 logrotate,但除非达到阈值,例如达到文件大小或经过适当的时间,否则不会轮换日志。

大小选项不能确保您的轮换日志也具有指定的大小。要使它们接近指定的大小,您需要足够频繁地调用 logrotate 程序。这很关键。

对于快速建立的日志文件(例如每天数百 MB),除非您希望它们非常大,否则您需要确保经常调用 logrotate!这很关键。

因此,要阻止磁盘被数 GB 的日志文件填满,您需要确保足够频繁地调用 logrotate,否则日志轮换将无法如您所愿。

在 Ubuntu 上,您可以通过将脚本 /etc/cron.daily/logrotate 移动到 /etc/cron.hourly/logrotate 轻松切换到每小时轮换

或添加

*/5 * * * * /etc/cron.daily/logrotate 

到您的 /etc/crontab 文件。每 5 分钟运行一次。

size选项忽略每日、每周、每月时间选项。但是 minsize 和 maxsize 考虑到了这一点。

手册页在那里有点混乱。这是我的解释。

minsize仅当文件达到适当的大小并且经过设置的时间段时才旋转。 例如 minsize 50MB + daily 如果文件在每日时间结束前达到 50MB,它会一直增长到第二天。

maxsize当日志达到设定的大小或经过适当的时间时,将轮换。 例如 maxsize 50MB + 每天。如果文件是 50MB 并且我们还没有到第二天,则日志将被轮换。如果文件只有 20MB 并且我们滚动到第二天,那么文件将被轮换。

size当日志 > 大小时将旋转。无论是否指定了每小时/每天/每周/每月。因此,如果您的大小为 100M - 这意味着当您的日志文件大于 100M 时,如果在此条件为真时运行 logrotate,则日志将被轮换。一旦它旋转,主日志将为 0,随后的运行将不执行任何操作。

所以在op的情况下。特别是最大 50MB 我会使用类似以下的东西:

/var/log/logpath/*.log {
    maxsize 50M
    hourly
    missingok
    rotate 8
    compress
    notifempty
    nocreate
}

这意味着他最多可以创建 8 小时的日志。其中有 8 个,每个不超过 50MB。因为他说他每天都会获得数 GB 的数据,并假设它们以相当恒定的速度增加,并且使用了 maxsize,他最终将接近每个文件达到的最大值。因此,它们每个可能接近 50MB。考虑到他们构建的体积,他需要确保 logrotate 的运行频率足以满足目标大小。

由于我每小时都放在那里,我们需要 logrotate 至少每小时运行一次。但是由于它们每天增加 2 GB,而我们想要 50MB……假设恒定速率为每小时 83MB。所以你可以想象,如果我们每小时运行一次 logrotate,尽管将 maxsize 设置为 50,在这种情况下我们最终会得到 83MB 的日志。因此,在这种情况下,将运行设置为每 30 分钟或更短时间就足够了。

确保每 30 分钟运行一次 logrotate。

*/30 * * * * /etc/cron.daily/logrotate 
于 2014-05-19T02:07:30.553 回答
90

它指定日志文件的大小以触发轮换。例如size 50M,一旦文件大小为 50MB 或更大,就会触发日志轮换。您可以使用M兆字节、k千字节和G千兆字节的后缀。如果不使用后缀,则表示字节。您可以在最后查看示例。有 3 个指令可用sizemaxsizeminsize。根据手册页

minsize size
              Log  files  are  rotated when they grow bigger than size bytes,
              but not before the additionally specified time interval (daily,
              weekly,  monthly, or yearly).  The related size option is simi-
              lar except that it is mutually exclusive with the time interval
              options,  and  it causes log files to be rotated without regard
              for the last rotation time.  When minsize  is  used,  both  the
              size and timestamp of a log file are considered.

size size
              Log files are rotated only if they grow bigger then size bytes.
              If size is followed by k, the size is assumed to  be  in  kilo-
              bytes.  If the M is used, the size is in megabytes, and if G is
              used, the size is in gigabytes. So size 100,  size  100k,  size
              100M and size 100G are all valid.
maxsize size
              Log files are rotated when they grow bigger than size bytes even before
              the additionally specified time interval (daily, weekly, monthly, 
              or yearly).  The related size option is  similar  except  that  it 
              is mutually exclusive with the time interval options, and it causes
              log files to be rotated without regard for the last rotation time.  
              When maxsize is used, both the size and timestamp of a log file are                  
              considered.

这是一个例子:

"/var/log/httpd/access.log" /var/log/httpd/error.log {
           rotate 5
           mail www@my.org
           size 100k
           sharedscripts
           postrotate
               /usr/bin/killall -HUP httpd
           endscript
       }

这是对文件/var/log/httpd/access.log/var/log/httpd/error.log. 只要它们的大小超过 100k,它们就会被轮换,并且旧的日志文件www@my.org在经过 5 轮轮换后被邮寄(未压缩),而不是被删除。这sharedscripts意味着postrotate脚本将只运行一次(在旧日志被压缩之后),而不是为每个轮换的日志运行一次。请注意,本节开头第一个文件名周围的双引号允许 logrotate 旋转名称中带有空格的日志。正常的 shell 引用规则适用,支持,, 和\字符。

于 2013-11-24T18:45:27.823 回答