有没有一种方法/工具来tail
或watch
日志文件,并报告它增长的行数量?
例如,我想每3秒查看mysql.log中新条目的数量。
watch wc -l /path/to/log.log1
只显示累计金额。 我不想truncate
日志之间。
你所要做的就是将文件redirect到wc
,它只显示添加的内容而不是总数。
watch wc -l < /path/to/log.log1
<
使所有的差异。
这里有一些快速和肮脏的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]#
希望有帮助…
我不知道任何标准的工具,但你可以使用下面的Python脚本:
导入sys,时间 如果不是len(sys.argv)> = 2: 打印'用法:%s FILENAME FREQUENCY'%(sys.argv [0]) sys.exit(1) FD =开放(sys.argv中[1]) FREQ = INT(sys.argv中[2]) fd.seek(0,2) 而真: 当前= fd.tell() nlines = len(fd.readlines()) 如果nlines: 打印nlines time.sleep(频率)
去testing:
$(while true; do echo test; sleep 0.2; done)> log& $ python watchandcount.py日志3
这并不完美,因为它不能“监视” STDIN
或检测文件被replace的时间( --follow=name
tail的选项)。
这里是一个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