2

В настоящее время я использую tail -f для просмотра логов.

Есть ли более эффективный / читаемый / лучший способ просмотра журналов?

2 ответа2

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 является языком.

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

Вы можете найти несколько полезных примеров в 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
  }

Я уже использовал это много раз для запуска особых случаев.

DEMO

Например, есть 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
1

Как предполагает Ф. Хаури, вы можете использовать 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 закрывает escape-последовательность
    • $1 включает строку ввода
    • \033[0m - это вторая последовательность, чтобы вернуть стандартное форматирование после того, как строка была выведена
    • \007 звуковых сигналов
  3. -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;' раскрашивает каждую строку, содержащую "ОШИБКА"; единственные различия касаются цветов:
    • 31 означает желтый передний план
    • 43 означает красный фон

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .