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