Подсчитать количество новых строк с интервалом в журнале
Есть ли способ / инструмент для tail
или же watch
лог-файл и сообщать количество строк он растет?
Например, я хочу видеть количество новых записей в mysql.log каждые 3 секунды.
watch wc -l /path/to/log.log1
показывает только накопленное количество. Я бы предпочел не truncate
журнал промежуточный.
4 ответа
Все, что вам нужно сделать, это перенаправить файл в wc
и он покажет только то, что было добавлено, а не общее.
watch wc -l < /path/to/log.log1
<
имеет все значение.
Я не знаю ни одного стандартного инструмента, но вы могли бы использовать следующий скрипт Python:
импорт системы, время если не len(sys.argv) >= 2: print 'использование: %s FILENAME FREQUENCY' % (sys.argv[0]) sys.exit(1) FD = открыт (sys.argv[1]) FREQ = INT (sys.argv[2]) fd.seek(0, 2) пока верно: current = fd.tell() nlines = len(fd.readlines()) если nlines: печать строк time.sleep(частота)
Тестировать:
$ (пока верно; выполнить эхо-тест; сон 0,2; сделано) > log & $ python watchandcount.py log 3
Он не совершенен, потому что не может "контролировать" STDIN
или определить, когда файл был заменен (--follow=name
вариант хвоста.
А вот скрипт 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
Его преимущество в том, что его можно использовать непосредственно в оболочке, при условии, что вы не будете предупреждены о ";";)
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
Вот небольшой и быстрый 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]#
Надеюсь, это поможет...