Эффективная среда для просмотра журналов

Эффективная среда для просмотра журналов

В настоящее время я использую 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'
}
  1. -p: заключает скрипт в цикл и выводит обработанную строку
  2. -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'раскрашивает каждую строку, содержащую «WARN»
    • \033[начинает escape-последовательность (включает форматирование)
    • 31означает красный передний план
    • 43означает желтый фон
    • 1позволяет использовать жирные символы
    • mзакрывает последовательность выхода
    • $1включает в себя входную строку
    • \033[0mвторая последовательность для возврата форматирования по умолчанию к стандартному после вывода строки
    • \007пищит
  3. -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'раскрашивает каждую строку, содержащую «ERROR»; единственные различия касаются цветов:
    • 31означает желтый передний план
    • 43означает красный фон

В моем случае я включил визуальный звонок, поэтому при возникновении ошибки экран мигает (а динамик не пищит), а строки с ошибками/предупреждениями можно обнаружить очень быстро.

Вы можете получить более подробную информацию о:

Опять же, как объясняет Ф. Хаури в своем ответе, вы можете делать многое благодаря Perl, поэтому вы можете «разработать» свой собственный читатель журналов в зависимости от ваших потребностей.

Связанный контент