是否有方法/工具tail
或watch
日志文件来报告其增长的行数?
例如,我想每 3 秒查看 mysql.log 中的新条目数量。
watch wc -l /path/to/log.log1
仅显示累计金额。我不希望truncate
中间有日志。
答案1
您所要做的就是将文件重定向到wc
,它只会显示添加的内容而不是总数。
watch wc -l < /path/to/log.log1
这<
让一切都变得不同。
答案2
这里有一些快速而简单的 perl 可以做你想做的事情:
#!/usr/bin/perl
open(I, "<$ARGV[0]") || die "Can't open $ARGV[0]: $!\n";
while (1) {
my $count = 0;
while (<I>) { $count++; }
print scalar(localtime()), ": $count lines\n";
sleep(3);
seek(I, 0, 1); # clear the EOF on I
}
close(I);
这是在一个窗口中运行的输出:
[root@g3 tmp]# perl tt.pl FILE
Thu Dec 9 13:18:38 2010: 0 lines
Thu Dec 9 13:18:41 2010: 0 lines
Thu Dec 9 13:18:44 2010: 0 lines
Thu Dec 9 13:18:47 2010: 0 lines
Thu Dec 9 13:18:50 2010: 0 lines
Thu Dec 9 13:18:53 2010: 1 lines
Thu Dec 9 13:18:56 2010: 0 lines
Thu Dec 9 13:18:59 2010: 1 lines
Thu Dec 9 13:19:02 2010: 0 lines
Thu Dec 9 13:19:05 2010: 0 lines
Thu Dec 9 13:19:08 2010: 0 lines
Thu Dec 9 13:19:11 2010: 0 lines
Thu Dec 9 13:19:14 2010: 0 lines
Thu Dec 9 13:19:17 2010: 0 lines
Thu Dec 9 13:19:20 2010: 100 lines
下面是我在另一个窗口中运行以生成上述输出的命令:
[root@g3 ~]# cd /tmp
[root@g3 tmp]# echo foo > FILE
[root@g3 tmp]# echo foo >> FILE
[root@g3 tmp]# for i in `seq 1 100`
> do
> echo $i >> FILE
> done
[root@g3 tmp]#
希望有帮助...
答案3
我不知道任何标准工具,但您可以使用以下 Python 脚本:
导入系统,时间 如果没有 len(sys.argv) >= 2: 打印'使用情况:%s 文件名频率'%(sys.argv [0]) 系统退出(1) fd=打开(sys.argv[1]) 频率=int(sys.argv[2]) fd.seek(0, 2) 而 True: 当前 = fd.tell() nlines = len(fd.readlines()) 如果 nlines: 打印多行 时间.睡眠(频率)
去测试:
$(当为真时;进行回显测试;睡眠 0.2;完成)> log & $ python watchandcount.py log 3
它并不完美,因为它无法“监视”STDIN
或检测文件何时被替换(--follow=name
尾部的选项)。
答案4
下面是一个 Bash 脚本:
TOTAL=0
while true; do
NEW_TOTAL=$(wc -l /path/to/log.log1 | cut -f1 -d' ')
echo $(($NEW_TOTAL - $TOTAL))
TOTAL=$NEW_TOTAL
sleep 3
done
它的优点是可以直接在 shell 中使用,只要你对“;”不过敏;)
TOTAL=0; while true; do NEW_TOTAL=$(wc -l TOTAL=0; while true; do NEW_TOTAL=$(wc -l big | cut -f1 -d' '); echo $(($NEW_TOTAL - $TOTAL)); TOTAL=$NEW_TOTAL; sleep 3; done | cut -f1 -d' '); echo $(($NEW_TOTAL - $TOTAL)); TOTAL=$NEW_TOTAL; sleep 3; done