tail -f 最近的日志文件

Joh*_*ohn 7 ls shell tail

在一些地方我得到了这个工作

ls -rt /path/to/log/file/ | tail -1 | xargs tail -f
Run Code Online (Sandbox Code Playgroud)

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

F. *_*uri 15

排序命令和最新的日志文件

为什么使用-r(反向排序)而不是使用tail?

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

tail -f `/bin/ls -1td /path/to/log/file/*| /usr/bin/head -n1`
Run Code Online (Sandbox Code Playgroud)

或者

tail -f $(/bin/ls -1t /path/to/log/file/* | /bin/sed q)
Run Code Online (Sandbox Code Playgroud)

工作正常。

注意:我喜欢使用,sed因为此命令存在于 中/bin,可能在/usr安装之前。

tail -f `/bin/ls -1tr /path/to/log/file/* | /bin/sed -ne '$p'`
Run Code Online (Sandbox Code Playgroud)

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

警告,在最后一个目录中,*必须与目录不匹配,否则命令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]}
Run Code Online (Sandbox Code Playgroud)

笔记:

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

但尾部支持观看多个文件:

尝试打开两个 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 <==
Run Code Online (Sandbox Code Playgroud)

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

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

第一个控制台可能如下所示:

==> /tmp/file_2 <==
25285

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

==> /tmp/file_3 <==
3053
Run Code Online (Sandbox Code Playgroud)

...

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

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

find /path/to/logdir -type f -mmin -10 -exec tail -f {} +
Run Code Online (Sandbox Code Playgroud)

用于查看最近 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;'
Run Code Online (Sandbox Code Playgroud)

您可以在哪里修改.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
Run Code Online (Sandbox Code Playgroud)

比在第二个控制台,再打一些

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


Pau*_*ida 6

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

ls -rt /var/log/apache2/* | tail -1 | xargs tail -f
Run Code Online (Sandbox Code Playgroud)