![如何对每天滚动一次 500MB 的文件执行 tail -f 操作?](https://linux22.com/image/76091/%E5%A6%82%E4%BD%95%E5%AF%B9%E6%AF%8F%E5%A4%A9%E6%BB%9A%E5%8A%A8%E4%B8%80%E6%AC%A1%20500MB%20%E7%9A%84%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%20tail%20-f%20%E6%93%8D%E4%BD%9C%EF%BC%9F.png)
我想执行以下操作来监视日志文件中的模式:
tail -f ./app.log | grep "My Pattern: .*" >> ./MyPattern.txt &
这工作正常,直到app.log
达到 500MB,它被移动到并创建app-2015-10-28.0.log
一个新的。app.log
当这种情况发生时,tail -f
将停止工作。停止并再次运行相同的命令会起作用,但在停止和启动之间,重新启动之间出现的模式可能会丢失。
滚动的另一个条件是 00:00 时。即使日志小于 500MB,也会发生相同的滚动。
日志滚动是在应用程序级别完成的,我们无法控制该部分。
我们怎样才能检测到日志已经滚动,而不错过感兴趣的模式?
答案1
tail
通常跟在文件描述符 ( --follow=descriptor
) 后面,当日志文件滚动或文件被移走时,文件描述符将变得不可访问。从手册页中可以看到这一点tail
:
- 重试
即使文件无法访问或变得无法访问,仍继续尝试打开该文件;当按名称跟随时有用,即使用 --follow=name
所以像这样使用它(tail
现在跟随名称而不是描述符):
tail --follow=name --retry logfile | grep "pattern"
当文件被截断或移走时,您将在 tails 输出中看到:
$ tail --follow=name --retry logfile
[...]
tail: logfile: file truncated
[...]
tail: `logfile' has become inaccessible: No such file or directory
tail: `logfile' has appeared; following end of new file
[...]