Atualmente estou usando tail -f
para visualizar logs.
Existe alguma maneira mais eficiente/legível/melhor de visualizar logs?
Responder1
Sim! perl
apoiarLinguagem Prática de Extração e Pesquisa.
Em vez de usar shell
sintaxes, 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
, like -u
in sed
sã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 perlfaq5
se 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 ~/.bashrc
ler 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'
}
-p
: envolve o script dentro de um loop e gera a linha processada-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)31
significa primeiro plano vermelho43
significa fundo amarelo1
permite caracteres em negritom
fecha sequência de escape$1
inclui 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\007
bipa
-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:31
significa primeiro plano amarelo43
significa 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:
perl -p
comando- Formatação de textoem casca
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.