“tail -f”和 logrotate 是如何工作的?

Posted

技术标签:

【中文标题】“tail -f”和 logrotate 是如何工作的?【英文标题】:How does "tail -f" and logrotate work? 【发布时间】:2014-07-12 10:33:13 【问题描述】:

当我为日志文件运行 tail -f 时,logrotate 旋转它但 tail -f 并没有停止。它继续在新文件中显示日志。之后我手动尝试;

mv my.log my.log.2
touch my.log
echo "test text" >> my.log
echo "test text" >> my.log

它不起作用。 logrotate 如何旋转日志?是否将所有行复制到新文件?

注意:我正在开发 centos 5。

【问题讨论】:

你为什么不阅读logrotate的源代码,看看它是如何工作的? 检查您的logrotate 配置文件,也许它在您测试的文件上使用了copytruncate 选项。 【参考方案1】:

即使文件被删除、重命名等,您也可能希望跟随 tail -F(大写 -F)。

  tail -F my.log

tail -f(小写)只使用文件描述符,它不关心文件名是什么。 tail -F 使用文件名,因此如果您删除或重命名原始文件并放置一个新文件,它将拾取新文件。

对于 logrotate,它有几种不同的工作方式。默认情况下,它会移动(重命名)原始文件,并创建一个新的空文件。在这种情况下,会为日志记录进程维护文件描述符,直到它关闭并重新打开,然后它将获取新文件。

如果您使用 logrotate "copytruncate" 选项,则文件和文件描述符都会被保留,并且 logrotate 会将所有数据复制到一个新文件中,截断原始文件并将原始文件保留在原处。某些进程不会关闭它们的日志文件,因此需要使用 copytruncate。没有它,该进程将继续以新名称登录文件。

此行为是设计使然,在 UNIX 中,打开文件的文件描述符不受重命名或删除操作的影响。

【讨论】:

我认为他的问题是为什么当logrotate 移动文件时他不需要这样做。他使用-f 并继续使用新文件。 知道了,由于他的措辞,我不清楚他所说的“新文件”是什么意思。 谢谢@mrjoltcola。你说的对。 conf文件中有copytruncate选项。【参考方案2】:

要知道这个问题的答案,你需要知道 logrotate 对文件做了什么。从尾部手册页

使用--follow (-f),tail 默认跟随文件描述符,这意味着即使一个tail'ed文件被重命名,tail 将继续跟踪它的结尾。当您真的想跟踪文件的实际名称而不是文件时,这种默认行为是不可取的 描述符(例如,日志轮换)。在这种情况下使用 --follow=name。这会导致 tail 以适应的方式跟踪命名文件 重命名、删除和创建。

您所看到的表明当 logrotate 作用于文件时 fd 没有改变,因此它很可能使用了 copytruncate 方法。

【讨论】:

以上是关于“tail -f”和 logrotate 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell tail -f如何自动终止

tail -f 与tail F 与tailf三者区别

tail -f 和 -F 的用法

logrotate

jsp 查看日志文件(如“web tail -f”)

tali -f 和 tail -F 之间的区别