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