当我为日志文件运行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。
答案 0 :(得分:6)
即使文件被删除,重命名等,您也可能需要使用tail -F(大写-F)。
tail -F my.log
tail -f(小写)仅使用文件描述符,它不关心文件名是什么。 tail -F使用文件名,因此如果您删除或重命名原始文件并放置一个新文件,它将拾取新文件。
至于logrotate,它有几种不同的方式。默认情况下,它会移动(重命名)原始文件,并创建一个新的空文件。在这种情况下,为日志记录过程维护文件描述符,直到它关闭并重新打开,然后它将获取新文件。
如果您使用logrotate" copytruncate"选项,然后维护文件和文件描述符,并logrotate将所有数据复制到新文件,截断原始文件并保留原始文件。某些进程不会关闭其日志文件,因此使用copytruncate是必要的。没有它,该过程将继续以其新名称登录到该文件。
此行为是设计使然,在UNIX中,打开文件的文件描述符不受重命名或删除操作的影响。
答案 1 :(得分:4)
要知道答案,你需要知道logrotate对文件做了什么。从尾部手册页
使用--follow(-f),tail默认遵循文件描述符,这意味着即使重命名尾部文件,tail也会继续跟踪它的结束。当您确实想要跟踪文件的实际名称而不是文件时,不希望出现此默认行为 描述符(例如,日志轮换)。在这种情况下使用--follow = name。这会导致tail以适应的方式跟踪指定的文件 重命名,删除和创建。
你看到的内容会表明当logrotate对文件起作用时fd没有改变,所以很可能使用了copytruncate方法。