我正在尝试通过 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
告诉服务重新打开日志文件。