Ambiente eficiente para visualização de logs

Ambiente eficiente para visualização de logs

Atualmente estou usando tail -fpara visualizar logs.

Existe alguma maneira mais eficiente/legível/melhor de visualizar logs?

Responder1

Sim! perlapoiarLinguagem Prática de Extração e Pesquisa.

Em vez de usar shellsintaxes, como:

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

ou

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

(Nota: --line-bufferedin grep, like -uin sedsão úteis para prevenirbuffer por blocos de tamanho fixo)

Para visualizar/navegar nos logs, perléolinguagem.

Dependendoo que você está esperando...talvez seja necessário criar um pequeno script que corresponda exatamente à sua necessidade.

Você pode encontrar alguns exemplos utilizáveis ​​no perlfaq, como em perldoc perlfaq5(ou man perlfaq5se você não instalou perldoc), há uma pergunta:Como faço um “tail -f” em perl?onde eu tirei isso:

Primeira tentativa

seek(GWFILE, 0, 1);

A instrução seek(GWFILE, 0, 1)não altera a posição atual, mas limpa a condição de fim de arquivo no identificador, para que a próxima <GWFILE>faça o Perl tentar ler algo novamente.

Se isso não funcionar (depende dos recursos da sua implementação stdio), você precisará de algo mais parecido com isto:

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 muitas vezes para acionar casos especiais.

DEMONSTRAÇÃO

Para amostra, há umquick and dirty contador de registros em tempo realtente! (precisa de acesso de leitura para /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 );
}

Produziria uma linha, auto-atualizada a cada segundo, contendo tudo vistodaemono nome de e um contador para cada um deles:

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

Responder2

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

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

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: envolve o script dentro de um loop e gera a linha processada
  2. -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'colore cada linha contendo "WARN"
    • \033[inicia a sequência de escape (permite a formatação)
    • 31significa primeiro plano vermelho
    • 43significa fundo amarelo
    • 1permite caracteres em negrito
    • mfecha sequência de escape
    • $1inclui a linha de entrada
    • \033[0mé uma segunda sequência para colocar a formatação padrão de volta ao padrão, após a saída da linha
    • \007bipa
  3. -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'colore cada linha contendo "ERROR" ; as únicas diferenças dizem respeito às cores:
    • 31significa primeiro plano amarelo
    • 43significa fundo vermelho

No meu caso, ativei a campainha visual, para que minha tela pisque em caso de erro (e meu alto-falante não emita bipe) e as linhas de erro/aviso possam ser detectadas muito rapidamente.

Você pode obter mais informações sobre:

Novamente, como F. ​​Hauri explica em sua resposta, você pode fazer muitas coisas graças ao Perl, para poder "desenvolver" seu próprio leitor de log dependendo de suas necessidades.

informação relacionada