tail -f 最近的日志文件

tail -f 最近的日志文件

在一些地方我让它发挥作用

ls -rt /path/to/log/file/ | tail -1 | xargs tail -f

但我不明白为什么它并不总是有效
(这是快速修复,直到我在这里修复日志滚动)

答案1

排序命令和 THE最近的日志文件

为什么使用-r(反向排序顺序)而不是使用 到达输出末尾tail

使用正常的排序顺序并获取第一个条目会更快!

tail -f `/bin/ls -1td /path/to/log/file/*| /usr/bin/head -n1`

或者

tail -f $(/bin/ls -1t /path/to/log/file/* | /bin/sed q)

工作正常。

注意:我喜欢使用,sed因为这个命令存在于 中/bin,也许在/usr安装之前。

tail -f `/bin/ls -1tr /path/to/log/file/* | /bin/sed -ne '$p'`

会起作用,但是,正如已经说过的:反转排序顺序,而不是删除整个输出以仅使用最后一个条目是不行的一个真正的好主意;-)

警告,在最后一个目录中,*必须不匹配目录,否则命令tail将不知道如何打开它。

相同,但用于find搜索最新文件:

read -a file < <(
    find /tmp 2>/dev/null -type f -mmin +-1 -mmin -10 -printf "%Ts %p\n" |
    sort -rn)
tail -f ${file[1]}

笔记:

  • 确保-mmin +-1不列出错误的定时文件:在未来
  • read是内置的,创建一个数组并阻止使用head -n1| cut -d \ -f2
  • -mmin -10可以更改或抑制,但这会阻止长时间的排序过程。

但 tail 支持观看多个文件:

尝试打开两个 shell 控制台并尝试以下操作:

在第一个控制台中:

user@host[pts/1]:~$ touch /tmp/file_{1,2,3}
user@host[pts/1]:~$ tail -f /tmp/file_{1,2,3}
==> /tmp/file_1 <==

==> /tmp/file_2 <==

==> /tmp/file_3 <==

在第二个中,在保持第一个控制台可见的同时,多次点击:

user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
25285
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
16381
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
19766
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
3053

第一个控制台可能看起来像:

==> /tmp/file_2 <==
25285

==> /tmp/file_1 <==
16381
19766

==> /tmp/file_3 <==
3053

...

在SO问题的想法中,但是基于时间的多文件

通过使用find命令,我们可以监视最后几分钟-mmin或最后几天修改的文件-mtime

find /path/to/logdir -type f -mmin -10 -exec tail -f {} +

用于监视最近 10 分钟修改的日志文件。

笔记:

  • 看看man tail,关于
    • -F长时间观看的选项
    • -q不打印文件名的选项

花哨的格式

find /path/to/logdir -type f -mmin -10 -exec tail -f {} + |
    sed -une 's/^==> .path.to.logdir.\(.*\) <==$/\1             /;ta;bb;
               :a;s/^\(.\{12\}\) *$/\1: /;h;bc;
               :b;G;s/^\(..*\)\n\(.*\)/\2 \1/p;:c;'

您可以在其中修改.path.to.logdir.和更改12为更合适的长度。

例如,保留我们的两个控制台,第一个停止并尝试

user@host[pts/1]:~$ find /tmp/ -type f -mtime -1 -name 'file_?' -exec tail -f {} + |
    sed -une 's/^==> .tmp.\(.*\) <==$/\1             /;ta;bb;
        :a;s/^\(.\{12\}\) *$/\1: /;h;bc;
        :b;G;s/^\(..*\)\n\(.*\)/\2 \1/p;:c;'
file_2      :  25285
file_1      :  16381
file_1      :  19766
file_3      :  3053

比在第二个控制台,再次点击一些

user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM

答案2

除非您位于 中,否则这将不起作用/path/to/log/file,因为ls只给您文件的名称,而tail -f不会找到它。如果您*在末尾添加一个ls,它将为您提供完整路径:

ls -rt /var/log/apache2/* | tail -1 | xargs tail -f

答案3

最简单的解决方案是使用 zsh 并利用全局限定符 om按修改时间排序(最近的在前)并[1]仅保留第一个匹配项。

tail -f /path/to/log/directory/*(om[1])

如果您没有 zsh,请安装它。如果您确实不想安装 zsh,那么使用 也不错ls,只要您的文件名不包含任何特殊字符(任何不可打印的字符都会带来麻烦),这对于日志文件来说应该没问题。注意正如 Paylo Almeida 已经说过的您不能只使用 的输出,ls /path/to/log/directory因为它显示相对于 的路径/path/to/log/directory。您可以先更改到该目录:

cd /path/to/log/directory
tail -f "$(ls -t | head -n 1)"

或者您可以添加路径:

tail -f "/path/to/log/directory/$(ls -t /path/to/log/directory | head -n 1)"

或者您可以ls打印完整路径:

tail -f "$(ls -t /path/to/log/directory/* | head -n 1)"

tail命令将永远跟踪同一个文件,即使之后创建了更新的日志文件。如果您想自动切换到不同的文件,则需要一种更复杂的方法,即检测新文件并tail在新文件上启动新实例。在Linux下,您可以使用inotify界面。

while true; do
  tail -n +1 -f /path/to/log/directory/*(om[1])
  inotifywait -qq -e create /path/to/log/directory
  kill $!
done

答案4

转到事件日志目录并给出尾部-f *查看所有最近的日志。

相关内容