unix logrotate指定块大小

如何指定旋转后所需的输出文件大小? 例如,假设我想在日志文件达到10MB时运行logrotate,并且想将这个日志分成最大为1MB的块。 我已经find选项“大小”,但这设置限制以上运行logrotate,而不是所需的大小块。 谢谢

logrotate本身不支持分割旋转的log / s,只能压缩。

您可以通过编写处理分割的自己的脚本来获得所需的行为,并将其作为特定文件的logrotateconfiguration中的postrotate脚本调用。

更新 :根据你的评论(“分裂文件为时已晚,因为它们将被logrotate分割”),似乎你仍然认为logrotate正在分割文件。 这是不正确的,实际发生的是logrotate重命名现有文件,并用原始名称创build一个新的空文件。

一个例子:

/var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate reload rsyslog >/dev/null 2>&1 || true endscript } 

当logrotate运行时:

  • 它将/ var / log / syslog重命名为/var/log/syslog.1
  • 然后创build一个新的空文件/ var / log / syslog。
  • 重命名文件对任何具有打开文件句柄的进程都没有影响,因此在执行此操作后,rsyslog进程仍在写入旧文件syslog.0。 通常情况下,解决这个问题的方法是重新加载写入文件的进程,这就是postrotate脚本中发生的情况。 rsyslog被告知重新加载,它closures其现有的文件句柄到/var/log/syslog.0,并使用文件名/ var / log / syslog(由logrotate创build的新的空文件)打开一个新的文件句柄。

希望你能更好地理解现在的logrotate在做什么。

更新2 :我将在这里解决您的意见,因为评论部分的格式选项是有限的。

所以当我在后处理部分理解正确时,需要重新加载rsyslog来确保旧文件描述符(旋转之前)将被closures,新文件描述符(旋转后)将被打开(因为:mv syslog syslog.1) ?

100%正确。 logrotate移动文件后,rsyslog仍在写入旧的文件描述符。 一个进程在文件描述符上执行I / O,这个名字只在文件上执行初始打开时才有意义。

我认为logrotate有一些自动实现这一点的机制。

不,所以需要在postrotate脚本中完成。 请记住,并不是所有的日志logging都必须由保持打开文件描述符的进程完成。 如果你有一个进程打开一个文件,写入文件,然后closures(文件描述符),那么你不需要大惊小怪。

PS:你的意思是“syslog.0”而不是“syslog”在下面的句子中:“rsyslog进程仍在写入旧文件syslog.0”。 打扰“旧”日志是/ var / log / syslog不是/var/log/syslog.0。 谢谢

不,我的意思是它仍然写入现有的文件描述符,该logrotate已经重命名为syslog.0。 在处理像rsyslog这样的进程时,请记住,文件名只与rsyslog打开时相关,也就是创build文件描述符的时候。 之后,您可以重新命名,移动,甚至删除该文件,并且该进程继续不受阻碍地在文件描述符上执行I / O。