unix logrotate 指定块大小

Wak*_*nka 2 log-files logrotate

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

Tha*_*Guy 6

logrotate 本身不支持分割旋转日志/秒,只支持压缩。

您可以通过编写自己的处理拆分的脚本来获得所需的行为,并将其称为该特定文件的 logrotate 配置中的 postrotate 脚本。

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

一个例子:

/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        postrotate
                reload rsyslog >/dev/null 2>&1 || true
        endscript
}
Run Code Online (Sandbox Code Playgroud)

当 logrotate 运行时:

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

希望您对 logrotate 现在正在做什么有更好的了解。

更新 2:我将在此处解决您的评论,因为评论部分中的格式选项有限。

因此,当我在后处理部分理解正确时,有必要重新加载 rsyslog 以确保关闭旧文件描述符(旋转前)并打开新文件描述符(旋转后)(因为:mv syslog syslog.1) ?

100% 正确。logrotate 移动文件后,rsyslog 仍在写入旧的文件描述符。进程对文件描述符执行 I/O,名称仅在对文件执行初始打开时有用。

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

不,因此需要在 postrotate 脚本中进行。请记住,并非所有日志记录都必须由保持打开文件描述符的进程完成。如果你有一个进程打开一个文件,写入它然后反复关闭(文件描述符),那么你不需要在 postrotate 中大惊小怪。

PS:在以下句子中,您的意思是“syslog.0”而不是“syslog”:“rsyslog 进程仍在写入旧文件 syslog.0。”?因为“旧”日志是 /var/log/syslog 不是 /var/log/syslog.0。谢谢

不。我的意思是它仍在写入现有的文件描述符,logrotate 已重命名为 syslog.0。在处理像 rsyslog 这样的进程时,请始终记住文件名仅在 rsyslog 打开它时才相关,即当它创建文件描述符时。之后,您可以重命名、移动甚至删除文件,进程将继续对文件描述符执行 I/O,不受阻碍。