logrotate 如何工作?

logrotate 如何工作?

我正在尝试通过 logrotate 监控一个频繁轮换的日志文件。但我无法正确获取它。有人能解释一下 logrotate 实际上是怎样工作的吗?

是否重命名文件并创建新文件?

或者是用新名称复制文件并清空当前文件?

旋转前:

131887 -rw-r--r-- 1 root root  11385 Sep 25 03:40 /var/log/sas.log

旋转后:

131887 -rw-r--r-- 1 root root  0 Sep 25 04:40 /var/log/sas.log

131911 -rw-r--r-- 1 root root   11385 Sep  25 04:40 /var/log/sas.log.1

答案1

如果配置文件中启用了 truncate 选项,则文件不会被移动 - 其内容只会复制到新创建的另一个文件中,并且当前文件将被清除,因此 inode id 不会改变。实际上文件从未改变过。

答案2

旋转后,当前日志文件将被移动,并且如果指定了压缩,则可能被压缩。然后重新创建。[寻找除我的经验之外的来源]

如果正在运行的服务在轮换时打开了日志文件,那么就会出现问题。文件将被取消链接,但磁盘空间并未真正释放,因为文件仍处于打开状态。

这就是为什么服务通常会安装更复杂的 logrotate 脚本来处理轮换。例如,定义Web 服务器/etc/logrotate.d/nginx的轮换行为nginx

[....]
postrotate
    invoke-rc.d nginx rotate >/dev/null 2>&1
endscript

postrotate块在新日志文件创建后执行。它调用 nginx 的服务脚本,rotate告诉服务重新打开日志文件

相关内容