Shell - Personalize a cor de cada linha de um arquivo de log com base em um padrão [duplicado]

2

Eu gostaria de mudar a forma como exibo um arquivo de log grande (~ 6000 linhas) usando wim, less ou whatever, para simplificar a verificação de problemas.

Gostaria de destacar algumas linhas do log com base em um padrão (por exemplo, error , warning , info ...) e / ou ocultar algumas outras.

Quais ferramentas eu posso usar? Eu só preciso de um script de shell? É importante que, após o processo, eu possa ler a saída usando menos, vim, ... para executar operações de busca!

Editar: um pequeno pedaço do log:

2016/10/25 12:19:24.403355 INFO <ServiceManager.cpp#2614 TID#3> Security object has NOT been parsed
2016/10/25 12:19:24.403369 INFO <ServiceManager.cpp#1263 TID#3> Service object sequence started
2016/10/25 12:19:24.403372 DBG <ServiceManager.cpp#1276 TID#3> preinvoke succeeded
    
por gepeppe 25.10.2016 / 12:41

4 respostas

5

Eu recomendaria um script de shell, baseado em awk como a solução de Valentin B.:

$ cat colorize
awk '
function color(c,s) {
        printf("3[%dm%s3[0m\n",30+c,s)
}
/error/ {color(1,$0);next}
/success/ {color(2,$0);next}
/warning/ {color(3,$0);next}
/INFO/ {color(4,$0);next}
/DBG/ {color(5,$0);next}
{print}
' $1

Para poder visualizar interativamente o resultado colorido, eu usaria less no modo raw, por exemplo:

colorize mylog.txt | less -R
    
por 25.10.2016 / 14:19
1

awk , como mencionado em outras respostas, é definitivamente a ferramenta para alcançar primeiro.

Mas não é a única ferramenta, de longe.

A. O logtool de L. Lambert é especificamente projetado para arquivos de log de pós-processamento, e tem um complexo (e infelizmente mal documentado) sistema de configuração que permite atribuir um arquivo cheio de expressões regulares a cada uma das 13 cores.

cat *.log | logtool

Ele tem a distinção de entender logs que possuem timestamps TAI64N.

Para isso, adicione:

problemas com colorização

Infelizmente, algumas dessas ferramentas fazem a colorização de forma muito errada. Eles hardwire seqüências de controle, em vez de usar setaf / setab e assim por diante do terminfo.

Observe também que a colorização é complicada por razões mais sutis, e quase nenhum programa de coloração acerta. Para acertar completamente, um colorador tem que lidar com as margens automáticas e o mecanismo DEC VT linha pendente , que eu ainda não vi nenhum coloridor fazer. O GNU grep tem um bug de colorização bastante famoso nessa área, mas isso não é um problema limitado a grep .

Leitura adicional

por 25.10.2016 / 15:31
0

Após a verificação, você pode enviar diretamente texto colorido no terminal usando awk . Com o exemplo fornecido, você pode criar um arquivo de script do awk (por exemplo, displayLog.awk ) contendo o seguinte código:

# output INFO lines in cyan
$3 == "INFO" {
    print "3[36m"$0"3[0m"
    next
}

# don't display DBG lines
$3 == "DBG" {
    next
}

# output WARNING lines in bright yellow
$3 == "WARNING" {
    print "3[1;33m"$0"3[0m"
    next
}

# output ERROR lines in bright red
$3 == "ERROR" {
    print "3[1;31m"$0"3[0m"
    next
}

# If you want to skip all other lines, comment next line
{print}

Em seguida, abra uma janela de terminal limpa, verifique se a tela é ilimitada (você pode exibir todas as 6000 linhas de uma só vez) e use-a desta maneira:

$ awk -f displayLog.awk log.txt

OR Como o usuário jlliagre sugeriu em sua solução, canalize-o para o modo bruto less :

$ awk -f displayLog.awk log.txt | less -R

Isso deve fazer o truque! Você pode mexer nas cores e nas linhas que deseja exibir com base no código awk da amostra na minha resposta. Mais sobre codificação por cores aqui .

EDITAR

Se você quiser que apenas uma palavra seja colorida em vez de uma linha inteira (por exemplo, você quer que o ERRO esteja apenas em vermelho) faça o seguinte:

$3 == "ERROR" {
    $3 = "3[1;31m"$3"3[0m"
    print
    next
}
    
por 25.10.2016 / 14:12
-1

Se você quiser destacar alguma linha do log com base em um padrão (ou seja, erro, aviso, info ...), use o comando abaixo:

grep -rn "pattern" <logfile>

Este comando exibirá todas as linhas completas do arquivo de registro que terão o padrão como mencionado acima.

    
por 25.10.2016 / 12:52