如何使用给定的模式来追踪最新的日志文件

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

SoftwareLog.2010-08-01-08 SoftwareLog.2010-08-01-09 SoftwareLog.2010-08-01-10 

我试图尾随遵循最新的日志文件给出一个模式(例如SoftwareLog *),我意识到有:

 tail -F (tail --follow=name --retry) 

但只有一个特定的名称 – 这些名称按date和小时不同。 我尝试了这样的:

 tail --follow=name --retry SoftwareLog*(.om[1]) 

但通配符语句在传递到尾部之前被消除,并且每次尾部重试都不会重新执行。

有什么build议么?

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

    你可能想尝试multitail – http://www.vanheusden.com/multitail/

    如果你想坚持丹尼斯·威廉姆森的回答(我相应地把他给了他),这里是填补你的空白。

    在你的shell中,运行下面的脚本(或者是相当于zsh的,在我看到zsh标签之前,我用bash把它打了):

     #!/bin/bash TARGET_DIR="some/logfiles/" SYMLINK_FILE="SoftwareLog.latest" SYMLINK_PATH="$TARGET_DIR/$SYMLINK_FILE" function getLastModifiedFile { echo $(ls -t "$TARGET_DIR" | grep -v "$SYMLINK_FILE" | head -1) } function getCurrentlySymlinkedFile { if [[ -h $SYMLINK_PATH ]] then echo $(ls -l $SYMLINK_PATH | awk '{print $NF}') else echo "" fi } symlinkedFile=$(getCurrentlySymlinkedFile) while true do sleep 10 lastModified=$(getLastModifiedFile) if [[ $symlinkedFile != $lastModified ]] then ln -nsf $lastModified $SYMLINK_PATH symlinkedFile=$lastModified fi done 

    后台使用正常的方法进程(再次,我不知道zsh,所以它可能会不同)… … –

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

    然后tail -F $SYMLINK_PATH以便尾部交换符号链接或文件的旋转。

    这有点复杂,但我不知道用尾巴做这个的另一种方法。 如果任何人知道一个实用程序处理这个问题,那么让他们前进一步,因为我也喜欢自己也看到它 – 默认情况下,像Jetty这样的应用程序以这种方式记录,我总是编写一个在cron上运行的符号链接脚本来补偿为了它。

    [编辑:从一行的末尾删除了一个错误的'j'。 你也有一个不好的变量名“lastModifiedFile”不存在,你设置的专有名称是“lastModified”]

    我相信最简单的解决办法如下:

     tail -f `ls -tr | tail -n 1` 

    现在,如果您的目录包含其他日志文件(如“SystemLog”),而您只需要最新的“SoftwareLog”文件,那么您只需包含一个grep,如下所示:

     tail -f `ls -tr | grep SoftwareLog | tail -n 1` 

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

     #!/bin/bash PATTERN="$1" # Try to make sure sub-shells exit when we do. trap "kill -9 -- -$BASHPID" SIGINT SIGTERM EXIT PID=0 OLD_FILES="" while true; do FILES="$(echo $PATTERN)" if test "$FILES" != "$OLD_FILES"; then if test "$PID" != "0"; then kill $PID PID=0 fi if test "$FILES" != "$PATTERN" || test -f "$PATTERN"; then tail --pid=$$ -n 0 -F $PATTERN & PID=$! fi fi OLD_FILES="$FILES" sleep 1 done 

    然后运行它: tail.sh 'SoftwareLog*'

    如果将日志写入到检查之间,脚本将会丢失一些日志行。 但至少它是一个单一的脚本,没有符号链接要求。