Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用给定的模式跟踪-f最新的日志文件_Linux_Logging_Zsh_Tail - Fatal编程技术网

Linux 如何使用给定的模式跟踪-f最新的日志文件

Linux 如何使用给定的模式跟踪-f最新的日志文件,linux,logging,zsh,tail,Linux,Logging,Zsh,Tail,我使用的一些日志系统每小时创建一个日志文件,如下所示: SoftwareLog.2010-08-01-08 SoftwareLog.2010-08-01-09 SoftwareLog.2010-08-01-10 我试图跟踪给出模式的最新日志文件(如SoftwareLog*),我意识到: tail -F (tail --follow=name --retry) 但这只跟在一个特定的名字后面,而且这些名字在日期和时间上是不同的。我试过这样的方法: tail --follow=name --ret

我使用的一些日志系统每小时创建一个日志文件,如下所示:

SoftwareLog.2010-08-01-08
SoftwareLog.2010-08-01-09
SoftwareLog.2010-08-01-10
我试图跟踪给出模式的最新日志文件(如SoftwareLog*),我意识到:

tail -F (tail --follow=name --retry)
但这只跟在一个特定的名字后面,而且这些名字在日期和时间上是不同的。我试过这样的方法:

tail --follow=name --retry SoftwareLog*(.om[1])  
但是通配符语句在传递给tail之前被解析,并且不会在每次tail重试时重新执行


有什么建议吗?

我还没有测试过这个,但是一种可能有效的方法是运行后台进程,创建并更新一个符号链接到最新的日志文件,然后你将
tail-f
(或
tail-f
)这个符号链接。

[编辑:在快速搜索工具后]

你可能想试试multitail-

如果你想坚持丹尼斯·威廉姆森的答案(我也相应地给了他+1分),这里是为你填空的地方

在shell中,运行以下脚本(或者它是zsh等效脚本,在看到zsh标记之前,我在bash中快速编写了此脚本):

背景:使用普通方法的过程(同样,我不知道zsh,所以可能会有所不同)

/updateSymlink.sh 2>&1>/dev/null

然后
tail-F$SYMLINK\u路径
,这样tail就可以更改符号链接或旋转文件

这有点复杂,但我不知道用尾巴做这件事的其他方法。如果其他任何人知道有一个实用程序可以处理这个问题,那么让他们向前看,因为我也希望自己能看到它——像Jetty这样的应用程序默认情况下是这样记录日志的,我总是编写一个在cron上运行的符号链接脚本来补偿它


[编辑:从一行末尾删除了一个错误的“j”。您还有一个错误的变量名“lastModifiedFile”不存在,您设置的正确名称是“lastModified”]

我认为最简单的解决方案如下:

tail -f `ls -tr | tail -n 1`
tail -f `ls -tr | grep SoftwareLog | tail -n 1`
现在,如果您的目录包含其他日志文件,如“SystemLog”,并且您只需要最新的“SoftwareLog”文件,那么您只需包含一个grep,如下所示:

tail -f `ls -tr | tail -n 1`
tail -f `ls -tr | grep SoftwareLog | tail -n 1`
然后将其运行为:
tail.sh'SoftwareLog*'


如果在检查之间写入日志,脚本将丢失一些日志行。但至少它是一个脚本,不需要符号链接。

我们有每日循环日志文件:
/var/log/grails/customer-2020-01-03.log
。对于
tail
最新的一个,以下命令对我来说效果很好:

tail -f /var/log/grails/customer-`date +'%Y-%m-%d'`.log
注意:表达式中的
+
符号后没有空格)

因此,对于您来说,以下内容应该可以工作(如果您在同一个日志目录中):


谢谢,我可能不得不这么做。我研究了multitail,但不幸的是它只是交互式的,这意味着我不能将它的输出输送到其他地方。我会试试看,看看我能得到什么。问题是,我想这只运行时,尾巴运行和退出时,退出,我不知道如何做到这一点。谢谢!这基本上是我喜欢的唯一解决方案(我为此搜索了很多)。编辑以修复一个我第一次无法使用的bug。(因为getCurrentlySymlinkedFile返回的是一个空字符串,输入错误的lastModifiedDate也被计算为一个空字符串。)或者使用head而不是tail,使事情更简单=)ls-t | head-1 | xargs tail-FOr可以使用:
tail-f SoftwareLog。`date+'%Y-%m-%d-%H`
tail -f SoftwareLog.`date +'%Y-%m-%d-%H'`