如何指定旋转后所需的输出文件大小? 例如,假设我想在日志文件达到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运行时:
希望你能更好地理解现在的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。