Ambiente eficiente para visualizar logs [closed]

2

Atualmente, estou usando tail -f para visualizar registros.

Existe alguma maneira mais eficiente / legível / melhor de ver registros?

    
por Marcin Szymczak 11.01.2013 / 13:15

2 respostas

1

Sim! perl significa Linguagem de pesquisa e extração prática .

Em vez de usar as sintaxes shell , como:

tail -f file | grep --line-buffered someting

ou

tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'

(Nota: --line-buffered in grep , como -u in sed são úteis para evitar buffering por blocos de tamanho fixo )

Para ver / navegar por registros, perl é o idioma .

Dependendo do que você está esperando ... você pode ter que criar um pequeno script para corresponder exatamente à sua necessidade.

Você pode encontrar algumas amostras úteis no perlfaq, como em perldoc perlfaq5 (ou man perlfaq5 se você não instalou perldoc ), há uma pergunta: Como faço um " tail -f "in perl? onde eu tirei isto:

First try

seek(GWFILE, 0, 1);

The statement seek(GWFILE, 0, 1) doesn't change the current position, but it does clear the end-of-file condition on the handle, so that the next <GWFILE> makes Perl try again to read something.

If that doesn't work (it relies on features of your stdio implementation), then you need something more like this:

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
  }

Já usei isso várias vezes para acionar casos especiais.

DEMO

Por exemplo, há um contador de log quick and dirty em tempo real em teste! (precisa de acesso de leitura a /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 );
}

Produzia uma linha, auto-reflorante a cada segundo, contendo todo o nome do daemon e um contador para cada um deles:

smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1
    
por 11.01.2013 / 13:18
1

Como F. Hauri sugere, você poderia usar o perl para formatar a saída.

Para meu uso, criei um alias para o tail no meu ~/.bashrc para ler os logs do Glassfish. É muito simples (uma linha) e colore minha saída para sublinhar as linhas de erro / aviso:

tail-color() {
    tail $* | perl -p -e 's/(.*WARN.*)/3[31;43;1m$13[0m
tail-color() {
    tail $* | perl -p -e 's/(.*WARN.*)/3[31;43;1m$13[0m%pre%7/g;' -e 's/(.*ERROR.*)/3[33;41;1m$13[0m%pre%7/g;' -e 's/(.*SEVERE.*)/3[33;41;1m$13[0m%pre%7/g'
}
7/g;' -e 's/(.*ERROR.*)/3[33;41;1m$13[0m%pre%7/g;' -e 's/(.*SEVERE.*)/3[33;41;1m$13[0m%pre%7/g' }
  1. -p : envolve o script dentro de um loop e gera a linha processada
  2. -e 's/(.*WARN.*)/3[31;43;1m$13[0m3[7/g;' colore cada linha contendo "WARN"
    • 31 inicia a sequência de escape (ativa a formatação)
    • 43 significa primeiro plano vermelho
    • 1 significa fundo amarelo
    • m ativa caracteres em negrito
    • $1 fecha a seqüência de escape
    • 3[0m inclui a linha de entrada
    • -e 's/(.*ERROR.*)/3[33;41;1m$13[0m317/g;'7 é uma segunda sequência para colocar a formatação padrão de volta ao padrão, após a saída da linha
    • 43 beeps
  3. perl -p colore cada linha contendo "ERROR"; as únicas diferenças dizem respeito às cores:
    • %code% significa primeiro plano amarelo
    • %code% significa fundo vermelho

No meu caso, ativei a campainha visual, então minha tela pisca com erro (e meu alto-falante não apita) e as linhas de erro / aviso podem ser detectadas muito rapidamente.

Você pode obter mais informações sobre:

Mais uma vez, como F. Hauri explica em sua resposta, você pode fazer muitas coisas graças ao perl, para que você possa "desenvolver" seu próprio leitor de registros, dependendo de suas necessidades.

    
por 11.01.2013 / 14:55