В настоящее время я использую tail -f
для просмотра журналов.
Есть ли более эффективный/читабельный/лучший способ просмотра журналов?
решение1
Да! perl
ПоддерживатьПрактическое извлечение и исследование языка.
Вместо использования shell
синтаксиса, например:
tail -f file | grep --line-buffered someting
или
tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'
(Примечание: --line-buffered
в grep
, как -u
в sed
полезны для предотвращениябуферизация блоками фиксированного размера)
Для просмотра/просмотра журналов perl
,theязык.
В зависимости отчего вы ждете...Возможно, вам придется создать небольшой скрипт, который будет полностью соответствовать вашим потребностям.
Вы можете найти несколько полезных примеров в perlfaq, например perldoc perlfaq5
(или man perlfaq5
если вы не установили perldoc
), есть вопрос:Как выполнить команду «tail -f» в Perl?где я это взял:
Первая попытка
seek(GWFILE, 0, 1);
Этот оператор
seek(GWFILE, 0, 1)
не изменяет текущую позицию, но очищает условие конца файла для дескриптора, так что следующий<GWFILE>
оператор заставляет Perl снова попытаться что-то прочитать.Если это не сработает (зависит от особенностей вашей реализации stdio), то вам нужно что-то вроде этого:
for (;;) { for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) { # search for some stuff and put it into files } # sleep for a while seek(GWFILE, $curpos, 0); # seek to where we had been }
Я уже много раз использовал это для запуска особых случаев.
ДЕМО
Для примера, естьquick and dirty
счетчик журналов в реальном временипопробуйте! (нужен доступ для чтения /var/log/syslog
;-) :
#!/usr/bin/perl -w
my %counter;
open FH, "</var/log/syslog" or die;
my $curpos = ( stat FH )[7];
seek( FH, $curpos, 0 );
for ( ; ; ) {
for ( $curpos = tell(FH) ; <FH> ; $curpos = tell(FH) ) {
$counter{$3}++ if /^(\S+\s+){4}(\S+\/|)([^\/\[:]*)[\[:]/;
}
syswrite STDOUT, sprintf "\r%s\e[K",
join( ", ", map { sprintf "%s:%s", $_, $counter{$_} } keys %counter );
select undef,undef,undef,1;
seek( FH, $curpos, 0 );
}
Создаст одну строку, обновляющуюся каждую секунду и содержащую все увиденноедемонИмя и счетчик для каждого из них:
smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1
решение2
Как предлагает Ф. Хаури, для форматирования вывода можно использовать Perl.
Для своего использования я создал псевдоним для tail в моем, ~/.bashrc
чтобы читать логи Glassfish. Он очень простой (одна строка) и раскрашивает мой вывод, чтобы подчеркнуть строки ошибок/предупреждений:
tail-color() {
tail $* | perl -p -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;' -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;' -e 's/(.*SEVERE.*)/\033[33;41;1m$1\033[0m\007/g'
}
-p
: заключает скрипт в цикл и выводит обработанную строку-e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'
раскрашивает каждую строку, содержащую «WARN»\033[
начинает escape-последовательность (включает форматирование)31
означает красный передний план43
означает желтый фон1
позволяет использовать жирные символыm
закрывает последовательность выхода$1
включает в себя входную строку\033[0m
вторая последовательность для возврата форматирования по умолчанию к стандартному после вывода строки\007
пищит
-e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'
раскрашивает каждую строку, содержащую «ERROR»; единственные различия касаются цветов:31
означает желтый передний план43
означает красный фон
В моем случае я включил визуальный звонок, поэтому при возникновении ошибки экран мигает (а динамик не пищит), а строки с ошибками/предупреждениями можно обнаружить очень быстро.
Вы можете получить более подробную информацию о:
perl -p
команда- Форматирование текстав ракушке
Опять же, как объясняет Ф. Хаури в своем ответе, вы можете делать многое благодаря Perl, поэтому вы можете «разработать» свой собственный читатель журналов в зависимости от ваших потребностей.