如何使用给定模式尾随最新的日志文件

Axi*_*rse 10 linux logging zsh tail

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

SoftwareLog.2010-08-01-08
SoftwareLog.2010-08-01-09
SoftwareLog.2010-08-01-10
Run Code Online (Sandbox Code Playgroud)

我试图跟踪最新的日志文件给出一个模式(例如SoftwareLog*),我意识到:

tail -F (tail --follow=name --retry)
Run Code Online (Sandbox Code Playgroud)

但这只遵循一个特定的名称 - 这些名称按日期和小时分列.我尝试过类似的东西:

tail --follow=name --retry SoftwareLog*(.om[1])  
Run Code Online (Sandbox Code Playgroud)

但是,通配符语句在传递给尾部之前会被重新发送,并且不会在每次尾部重试时重新执行.

有什么建议?

小智 12

我相信最简单的解决方案如下:

tail -f `ls -tr | tail -n 1`
Run Code Online (Sandbox Code Playgroud)

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

tail -f `ls -tr | grep SoftwareLog | tail -n 1`
Run Code Online (Sandbox Code Playgroud)

  • 或使用头而不是尾巴,使事情更简单=)ls -t | 头-1 | xargs tail -F (7认同)

wha*_*ley 7

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

你可能想试试多头 - http://www.vanheusden.com/multitail/

如果你想坚持丹尼斯威廉姆森的答案(而且我已经相应地给他做了1次),这里有空白填补.

在你的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
Run Code Online (Sandbox Code Playgroud)

使用普通方法处理的背景(再次,我不知道zsh,所以可能会有所不同)......

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

然后tail -F $SYMLINK_PATH,尾部递交符号链接的更改或文件的旋转.

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

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