计算日志中间隔的新行数

计算日志中间隔的新行数

是否有方法/工具tailwatch日志文件来报告其增长的行数?

例如,我想每 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

相关内容