![如何知道后续尾部何时从旧文件移动到新文件](https://linux22.com/image/230717/%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E5%90%8E%E7%BB%AD%E5%B0%BE%E9%83%A8%E4%BD%95%E6%97%B6%E4%BB%8E%E6%97%A7%E6%96%87%E4%BB%B6%E7%A7%BB%E5%8A%A8%E5%88%B0%E6%96%B0%E6%96%87%E4%BB%B6.png)
所以,我正在使用 tail -F (或 tail --follow=filename)。现在,它的工作方式与宣传的一样,当发生翻转时,它将移动到新文件。
这很棒,可以帮助我跟踪我的日志。问题是我想知道尾部何时从旧文件移动到新文件。
情况如下:
我有一个巨大的日志文件,需要 15 分钟才能处理。现在假设在第 5 分钟,发生了翻转。 Tail 打开文件描述,并使用它来完成拖尾过程,然后移动到新的过程。
现在,我保留了上次记录的文件和行的历史记录。我通过增加进程的行数来做到这一点(它的多进程程序,但我还能做什么?)。
问题是,翻转后,新文件从第 0 行开始,但我的 line_number 已经增加到 500 万。因此,对于这个包含 100 个日志的新文件,我将行号存储为 5,000,100。
我使用看门狗来查找文件何时翻转以将行号重置为 0,但如果在初始运行期间发生翻转,例如在 15 分钟运行的 5 分钟标记处,那么我仍然会得到 3mil+ 的数字。
由于 line_number 用于从上次离开的位置继续,以防程序意外终止,这可能意味着数据丢失。
请注意:我正在从 python (CPython) 运行此命令
答案1
将stderr
from tail 重定向到stdout
,并处理提供的注释tail -F
。
tail -F myLog.txt 2>&1
您的 Python 代码现在应该收到如下消息:
tail: cannot open 'myLog.txt' for reading: No such file or directory
tail: 'myLog.txt' has appeared; following new file
tail: myLog.txt: file truncated
YMMV:报价似乎不可靠,并且文件翻转时可能存在竞争条件。但file truncated
后面应该是新的第 1 行。