文件名后的“ tail -f”替代


59

我使用定时旋转文件记录器生成了一些日志。这将记录到一个名为的文件中tool.log,并在午夜将其移至tool.log.<date>并启动一个new tool.log

tail -f tool.log正在机器上运行以查看日志,但是在午夜,tool.log将其重命名为时tool.log.<date>tail仍会继续观看重命名的文件。

我希望找到一个类似于的工具tail,但将继续监视名为的文件tool.log,而不是跟随inode。

是否存在这样的东西?如果没有,我可以为此目的用Python编写自己的代码。

Answers:


90

的某些实现tail为此提供了一个选项;这是GNU tail手册页中的描述:

-F
如同 --follow=name --retry

-f--follow[ ={ 名称 | 描述符 }]
输出的附加数据作为文件增长; -f--follow--follow=descriptor等同

--retry
继续尝试打开文件,即使该文件无法访问或无法访问;当按名称跟随时很有用,即--follow=name

由于POSIX未指定此选项,因此您不能在任何地方都依赖它。一些已知的实现:

  • GNU -已-F如上述那样
  • Mac OS X FreeBSD NetBSD-具有类似的-F选项,但效果相同
  • OpenBSD的 --f足够(如果文件被替换(即i节点号改变),尾巴会重新打开该文件并继续)
  • Solaris-无等效项
  • Busybox的 --F在新版本中,但必须与编译ENABLE_FEATURE_FANCY_TAIL(它不是由默认编译进)

55

替代方法是tail -F命令。

-F选项暗含--follow=namewith --retry选项,因此即使文件已被删除并重新创建,tail也会监视您的文件。


5

由于您要求替代

less实用程序可以替代tail -F

它必须按如下方式运行:less --follow-name filename.log并按Shift+ F

这将为您带来与相同的结果tail -F


谢谢。我只是因为没有意识到尾巴-F而选择了替代品。总是很高兴知道选项。

4

另一种选择是使用watch命令,该命令每n秒重复一次命令,在此示例中每2秒重复一次:

watch -n2 "tail tool.log"

查看日志后,请使用Ctrl+ C退出命令。


1
如果日志的滚动速度比刷新计时器慢,这似乎会创建很多重复的消息,而滚动速度更快,则会丢失一些消息。
Bobson,

3
Watch占据了整个屏幕,因此它不会重复显示消息,但是会取消向后滚动的功能。

3

lnav是另一个紧随文件名的出色工具。

您还可以将其指向目录,除所有其他各种简洁功能外,它将尾随该目录中的所有文件。


我发现它无法处理被截断和/或重命名的轮转日志(我不确定在特定情况下哪个会令它不满意),因此除非重新启动lnav,否则日志似乎会在午夜停止。我是否错过了一些明显的开关或技术,我想知道这似乎应该大步向前吗?
Stuart Hickinbottom

这取决于文件的截断方式。如果将-r标志传递给lnav,它将重新加载文件名(并加载以前循环的所有日志)
Wayne Werner

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.