我使用一些日志系统,每小时创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*'
如果将日志写入到检查之间,脚本将会丢失一些日志行。 但至少它是一个单一的脚本,没有符号链接要求。