我正在寻找一种在实时日志文件上拖尾的好方法,并显示具有相同日期/时间的行数。
目前正在运作:
tail -F /var/logs/request.log | [cut the date-time] | uniq -c
但表现不够好。延迟时间超过一分钟,每次输出的行数为几行。
有什么想法吗?
答案 0 :(得分:8)
您的问题很可能与您系统中的缓冲有关,而不是与您的代码行有任何本质错误。我能够创建一个可以重现它的测试场景 - 然后让它消失。我希望它也适合你。
这是我的测试场景。首先,我写一个短脚本,每100毫秒(大约)将时间写入一个文件 - 这是我的“日志文件”,它生成足够的数据uniq -c
应该每秒给我一个有趣的输出:
#!/bin/ksh
while :
do
echo The time is `date` >> a.txt
sleep 0.1
done
(注意 - 我必须使用能够进行亚秒ksh
的{{1}}
在另一个窗口中,我输入
sleep
果然,你每秒都会出现以下输出:
tail -f a.txt | uniq -c
等。没有延误。重要的是要注意 - 我没有尝试减少时间。接下来,我做了
9 The time is Thu Dec 12 21:01:05 EST 2013
10 The time is Thu Dec 12 21:01:06 EST 2013
10 The time is Thu Dec 12 21:01:07 EST 2013
9 The time is Thu Dec 12 21:01:08 EST 2013
10 The time is Thu Dec 12 21:01:09 EST 2013
9 The time is Thu Dec 12 21:01:10 EST 2013
10 The time is Thu Dec 12 21:01:11 EST 2013
10 The time is Thu Dec 12 21:01:12 EST 2013
你的问题再现 - 它会“挂起”很长一段时间(直到缓冲区中有4k个字符,然后它会立刻呕吐出来)。
在线搜索(https://stackoverflow.com/a/16823549/1967396)告诉我一个名为stdbuf的实用程序。在该参考文献中,它特别提到了您的场景,并提供了以下解决方法(复述以符合我上面的场景):
tail -f a.txt | cut -f7 -d' ' | uniq -c
这将是很棒的...除了我的机器(Mac OS)上不存在此实用程序 - 它特定于GNU coreutils。这让我无法测试 - 虽然它可能是一个很好的解决方案。
永远不要害怕 - 我找到了以下解决方法,基于tail -f a.txt | stdbuf -oL cut -f7 -d' ' | uniq -c
命令(我真的很难理解,但我改编自https://unix.stackexchange.com/a/25377给出的答案。)
创建一个名为socat
的小文件(这是上面链接中的“long_running_command”):
tailcut.sh
使用#!/bin/ksh
tail -f a.txt | cut -f7 -d' '
授予其执行权限。然后发出以下命令:
chmod 755 tailcut.sh
而且嘿presto - 你的块状输出不再是块状。 socat EXEC:./tailcut.sh,pty,ctty STDIO | uniq -c
将脚本的输出直接发送到下一个管道,socat
可以完成它。
答案 1 :(得分:2)
您可以尝试logtop
,(apt-get install logtop
):
用法:
tail -F /var/logs/request.log | [cut the date-time] | logtop
示例:
$ tail -f /var/log/varnish/varnishncsa.log | awk '{print $4}' | logtop
5585 elements in 10 seconds (558.50 elements/s)
1 690 69.00/s [28/Mar/2015:23:13:48
2 676 67.60/s [28/Mar/2015:23:13:47
3 620 62.00/s [28/Mar/2015:23:13:49
4 576 57.60/s [28/Mar/2015:23:13:53
5 541 54.10/s [28/Mar/2015:23:13:54
6 540 54.00/s [28/Mar/2015:23:13:55
7 511 51.10/s [28/Mar/2015:23:13:51
8 484 48.40/s [28/Mar/2015:23:13:52
9 468 46.80/s [28/Mar/2015:23:13:50
列从左到右:
答案 2 :(得分:1)
考虑uniq -c
的工作原理。
为了打印计数,它需要读取所有唯一的行,并且只需要一行与前一行不同,它可以打印行和出现次数。
这就是算法从根本上起作用的方式,并且没有办法解决它。
您可以通过运行
进行测试touch a
tail -F a | uniq -c
然后一个又一个
echo 1 >> a
echo 1 >> a
echo 1 >> a
没有任何反应。只有在你运行之后
echo 2 >> a
uniq
可以打印出3“1 \ n”次出现。