Como ter o tail -f mostrar a saída colorida

235

Eu gostaria de poder acompanhar a saída de um arquivo de log do servidor que tenha mensagens como:

INFO
SEVERE

etc, e se for SEVERE , mostre a linha em vermelho; se é INFO , em verde. Que tipo de alias eu posso configurar para um comando tail que me ajudaria a fazer isso?

    
por Amir Afghani 01.03.2011 / 20:13

19 respostas

211

Experimente o multitail . Esta é uma übergeneralização de tail -f . Você pode assistir a vários arquivos em janelas separadas, destacar linhas com base em seu conteúdo e muito mais.

multitail -c /path/to/log

As cores são configuráveis. Se o esquema de cores padrão não funcionar para você, escreva seu próprio no arquivo de configuração. Por exemplo, chame multitail -cS amir_log /path/to/log com o seguinte ~/.multitailrc :

colorscheme:amir_log
cs_re:green:INFO
cs_re:red:SEVERE

Outra solução, se você estiver em um servidor onde é inconveniente instalar ferramentas não padrão , é combinar tail -f com sed ou awk para adicionar seqüências de controle de seleção de cores. Isso requer tail -f para liberar sua saída padrão sem atraso, mesmo quando sua saída padrão é um pipe, não sei se todas as implementações fazem isso.

tail -f /path/to/log | awk '
  /INFO/ {print "3[32m" $0 "3[39m"}
  /SEVERE/ {print "3[31m" $0 "3[39m"}
'

ou com sed

tail -f /path/to/log | sed --unbuffered \
    -e 's/\(.*INFO.*\)/\o033[32m\o033[39m/' \
    -e 's/\(.*SEVERE.*\)/\o033[31m\o033[39m/'

Se o seu sed não for o GNU sed, substitua \o033 por um caractere de escape literal.

Outra possibilidade é executar tail -f em um buffer de shell Emacs e usar as habilidades de coloração de sintaxe do Emacs.

    
por 01.03.2011 / 21:29
104

grc , o colorador genérico é muito legal.

Apenas faça

grc tail -f /var/log/apache2/error.log

e divirta-se!

Você também encontrará no GitHub .

    
por 03.10.2011 / 16:57
46

Você já deu uma olhada no ccze ? Você tem a possibilidade de personalizar as cores padrão de algumas palavras-chave usando a opção -c ou diretamente no seu arquivo de configuração. Se a tela estiver limpa após o colorizing, você deve usar a opção -A .

Editar:

Se você realmente gostaria de ter a linha completa colorida em vermelho, você também pode tentar o seguinte:

$ tail -f myfile.log | perl -pe 's/.*SEVERE.*/\e[1;31m$&\e[0m/g'

\e[1;31m dará a você a cor vermelha. Se você quiser um pouco de amarelo, use \e[1;33m e, para verde, use \e[1;32m . O \e[0m restaura a cor normal do texto.

    
por 01.03.2011 / 21:09
30

Dê uma olhada no lnav , o visualizador avançado de arquivos de log.

Ele também pode imprimir vários formatos.

Antes:

Depois:

    
por 24.02.2015 / 15:46
21

Você pode usar o arco-íris , que colore as linhas com base em expressões regulares:

rainbow --red='SEVERE.*' --green='INFO.*' tail -f my-file.log

Ele também vem com configurações predefinidas , por exemplo, para logs do Tomcat:

rainbow --config=tomcat tail -f my-file.log
    
por 02.03.2011 / 23:28
14

Você pode usar colortail :

colortail -f /var/log/messages
    
por 26.04.2013 / 08:16
9

Note também que se você quer apenas procurar por um correspondente regex, o GNU grep com --color funcionará - apenas canalize sua tail de saída através disso.

    
por 16.03.2011 / 15:04
7

Eu gosto bastante do colorex . Simples, mas satisfatório.

tail -f /var/log/syslog | colorex -G '[0-9]{2}:[0-9]{2}:[0-9]{2}' -b $(hostname)
    
por 18.12.2012 / 18:52
6

Para obter resultados em cores a partir de comandos padrão, como grep , você deve definir esse alias em seu .bashrc

# User specific aliases and functions
alias grep='grep --color=auto'

quando você faz alguma coisa no seu arquivo, você vê algo assim (mas provavelmente em vermelho):

[root@linuxbox mydir]# grep "\(INFO\|SEVERE\)" /var/log/logname
this entry is an INFO 
SEVERE this entry is a warn!
this entry is an INFO
this entry is an INFO
SEVERE this entry is a warn!

se quiser usar tail ou awk e quiser que a cor sobreviva a um canal, o alias não será suficiente e você deverá usar o parâmetro --color=always , por exemplo:

[root@linubox mydir]# grep --color=always "\(INFO\|SEVERE\)" /var/log/logname | tail -f | awk '{ print $1 }'
this 
SEVERE
this
this
SEVERE

Se você quiser um texto colorido com awk , a história é um pouco complexa, mas mais poderosa, por exemplo:

[root@linubox mydir]# tail -f /var/log/messages | awk '{if ($5 ~ /INFO/) print "3[1;32m"$0"3[0m"; else if ($1 ~ /SEVERE/) print "3[1;31m"$0"3[0m"; else print $0}'
this entry is an INFO 
SEVERE this entry is a warn!
this is another ENTRY
this entry is an INFO
this is another ENTRY
this entry is an INFO
SEVERE this entry is a warn!

com cada linha em sua própria cor.

Existem muitas outras maneiras de obter texto colorido a partir do shell com outras ferramentas e elas são bem descritas por outros membros.

    
por 03.08.2012 / 17:57
5

Com base na resposta do @uloBasEI, tentei usar ... | perl ... | perl ... , mas o Linux fica um pouco louco e é muito lento. Se eu colocar todas as regras em apenas um comando perl , tudo funcionará bem.

Por exemplo, crie um arquivo perl colorTail.pl como abaixo:

#!/usr/bin/perl -w

while(<STDIN>) {
    my $line = $_;
    chomp($line);
    for($line){
        s/==>.*<==/\e[1;44m$&\e[0m/gi; #tail multiples files name in blue background
        s/.*exception.*|at .*/\e[0;31m$&\e[0m/gi;  #java errors & stacktraces in red
        s/info.*/\e[1;32m$&\e[0m/gi; #info replacement in green
        s/warning.*/\e[1;33m$&\e[0m/gi; #warning replacement in yellow
    }
    print $line, "\n";
}

Use como:

tail -f *.log | perl colorTail.pl
tail -f *.log -f **/*.log | perl colorTail.pl

NOTA: você pode usá-lo em MobaXTerm também! Basta baixar o plug-in perl do site MobaXTerm .

    
por 10.07.2014 / 15:08
3
tail -f /var/log/logname | source-highlight -f esc -s log
    
por 16.03.2011 / 12:56
3

Uma solução que funciona para colorir todos os tipos de texto, não apenas arquivos de log, é uma ferramenta Python, ' colout '.

pip install colout
myprocess | colout REGEX_WITH_GROUPS color1,color2... [attr1,attr2...]

Onde qualquer texto na saída de 'myprocess' que corresponda ao grupo 1 da regex será colorido com color1, group 2 com color2, etc.

Por exemplo:

tail -f /var/log/mylogfile | colout '^(\w+ \d+ [\d:]+)|(\w+\.py:\d+ .+\(\)): (.+)$' white,black,cyan bold,bold,normal

i.e. o primeiro grupo regex (parens) corresponde à data inicial no arquivo de log, o segundo grupo corresponde a um nome de arquivo python, número de linha e nome de função, e o terceiro grupo corresponde à mensagem de log que vem depois disso. Isso parece:

Observe que as linhas ou partes de linhas que não correspondem a nenhuma das minhas expressões regulares ainda são reproduzidas, portanto, isso não é como 'grep --color' - nada é filtrado da saída.

Obviamente, isso é flexível o suficiente para que você possa usá-lo com qualquer processo, não apenas com arquivos de log. Eu costumo apenas preparar um novo regex rapidamente toda vez que eu quero colorir algo. Por esta razão, eu prefiro colout a qualquer ferramenta de coloração de arquivo de log customizada, porque eu só preciso aprender uma ferramenta, independentemente do que eu esteja colorindo: logging, saída de teste, sintaxe destacando trechos de código no terminal, etc. p>     

por 19.08.2015 / 12:44
2

Plug sem vergonha: eu escrevi uma ferramenta chamada TxtStyle que faz algo parecido com as opções mencionadas anteriormente. Você pode executá-lo da seguinte maneira:

tail -f /var/log/syslog | txts --regex '\d+'

Você também pode definir estilos nomeados no arquivo de configuração ( ~/.txts.conf ) e usá-los da seguinte forma:

ifconfig | txts --name ifconfig

( ifconfig style é definido fora da caixa)

    
por 04.02.2013 / 21:51
1

Eu escrevi uma função bash que aceita até três parâmetros e faz um filtro tipo grep em um arquivo de texto, e produz texto para a tela em cores.

Eu também gostaria de ver uma função final que faria isso, mas ainda não encontrei nenhuma.

Esta função também pode ser melhorada - agradeço qualquer ajuda sobre como melhorá-la.

function multigrep(){

    #THIS WORKS - Recreate this, using input parameters
    #sed -En '/(App)|(Spe)/p' ./flashlog.txt;

    filename="/Users/stevewarren/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt";
    paramString="";

    for element in "$@"
        do
            #echo $element;
            paramString="$paramString($element)|";
        done

    #TRIM FINAL | OFF PARAMSTRING
    paramString=${paramString:0:${#paramString}-1};

    #CREATE SED EXPRESSION - '/($1)|($2)|(...)/p'
    paramString="'/$paramString/p'";

    #CREATE SED FUNCTION, CALL ON FILE
    paramString="sed -En $paramString ./flashlog.txt"

    echo $paramString;
    echo "${txtbld}$(tput setaf 7)" > ./flashlog_output.txt;
    eval $paramString >> ./flashlog_output.txt;
    echo >> ./flashlog_output.txt;
    #cat ./flashlog_output.txt;

    cat ./flashlog_output.txt | while read LINE
    do

        [[  $1 && ${1-x} ]] && 
            if grep -q $1 <<<$LINE; then
                echo "$(tput setaf 3)$LINE"
            fi

        [[  $2 && ${2-x} ]] && 
            if grep -q $2 <<<$LINE; then
                echo "$(tput setaf 7)$LINE"
            fi


        [[  $3 && ${3-x} ]] && 
            if grep -q $3 <<<$LINE; then
                echo "$(tput setaf 6)$LINE"
            fi

    done
}
    
por 04.03.2013 / 21:43
1

claro!

Eu escrevi long a go uma função chamada "egrepi", baseada nas 8 definições de variáveis de cores. Isso funciona SOMENTE canalizado como uma função colorida "tail -f".

1. setColors

primeiro, as variáveis de cor funcionam para serem chamadas primeiro:


setColors ()
{
set -a
which printf >/dev/null 2>&1 && print=printf || print=print # Mandriva doesn't know about printf

hide='eval tput civis'
show='eval tput cnorm'
CLS=$(tput clear)
bel=$(tput bel)

case ${UNAME} in
AIX)
# text / foreground
N=$(${print} '3[1;30m')
n=$(${print} '3[0;30m')
R=$(${print} '3[1;31m')
r=$(${print} '3[0;31m')
G=$(${print} '3[1;32m')
g=$(${print} '3[0;32m')
Y=$(${print} '3[1;33m')
y=$(${print} '3[0;33m')
B=$(${print} '3[1;34m')
b=$(${print} '3[0;34m')
M=$(${print} '3[1;35m')
m=$(${print} '3[0;35m')
C=$(${print} '3[1;36m')
c=$(${print} '3[0;36m')
W=$(${print} '3[1;37m')
w=$(${print} '3[0;37m')
END=$(${print} '3[0m')

# background
RN=$(${print} '3[6;40m')
Rn=$(${print} '3[40m')
RR=$(${print} '3[6;41m')
Rr=$(${print} '3[41m')
RG=$(${print} '3[6;42m')
Rg=$(${print} '3[42m')
RY=$(${print} '3[6;43m')
Ry=$(${print} '3[43m')
RB=$(${print} '3[6;44m')
Rb=$(${print} '3[44m')
RM=$(${print} '3[6;45m')
Rm=$(${print} '3[45m')
RC=$(${print} '3[6;46m')
Rc=$(${print} '3[46m')
RW=$(${print} '3[6;47m')
Rw=$(${print} '3[47m')

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)
;;
*)
# text / foreground
n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)

# background
Rn=$(tput setab 0)
Rr=$(tput setab 1)
Rg=$(tput setab 2)
Ry=$(tput setab 3)
Rb=$(tput setab 4)
Rm=$(tput setab 5)
Rc=$(tput setab 6)
Rw=$(tput setab 7)
RN=$(tput setab 8)
RR=$(tput setab 9)
RG=$(tput setab 10)
RY=$(tput setab 11)
RB=$(tput setab 12)
RM=$(tput setab 13)
RC=$(tput setab 14)
RW=$(tput setab 15)
;;
esac

BLUEf=${B}
BLUE=${b}
REDf=${R}
RED=${r}
GREENf=${G}
GREEN=${g}
YELLOWf=${Y}
YELLOW=${y}
MANGENTAf=${M}
MANGENTA=${m}
WHITEf=${W}
WHITE=${w}
CYANf=${C}
CYAN=${c}

OK="${RG}${n}OK${END}"
KO="${RR}${n}KO${END}"
NA="${N}NA${END}"

COLORIZE='eval sed -e "s/{END}/${END}/g" -e "s/{HIGH}/${HIGH}/g" -e "s/{SMUL}/${SMUL}/g" -e "s/{RMUL}/${RMUL}/g" -e "s/{BLINK}/${BLINK}/g" -e "s/{REVERSE}/${REVERSE}/g" -e "s/{REVERSO}/${REVERSO}/g"'
LOWS=' -e "s/{n}/${n}/g" -e "s/{r}/${r}/g" -e "s/{g}/${g}/g" -e "s/{y}/${y}/g" -e "s/{b}/${b}/g" -e "s/{m}/${m}/g" -e "s/{c}/${c}/g" -e "s/{w}/${w}/g"'
HIGHS=' -e "s/{N}/${N}/g" -e "s/{R}/${R}/g" -e "s/{G}/${G}/g" -e "s/{Y}/${Y}/g" -e "s/{B}/${B}/g" -e "s/{M}/${M}/g" -e "s/{C}/${C}/g" -e "s/{W}/${W}/g"'
REVLOWS=' -e "s/{Rn}/${Rn}/g" -e "s/{Rr}/${Rr}/g" -e "s/{Rg}/${Rg}/g" -e "s/{Ry}/${Ry}/g" -e "s/{Rb}/${Rb}/g" -e "s/{Rm}/${Rm}/g" -e "s/{Rc}/${Rc}/g" -e "s/{Rw}/${Rw}/g"'
REVHIGHS=' -e "s/{RN}/${RN}/g" -e "s/{RR}/${RR}/g" -e "s/{RG}/${RG}/g" -e "s/{RY}/${RY}/g" -e "s/{RB}/${RB}/g" -e "s/{RM}/${RM}/g" -e "s/{RC}/${RC}/g" -e "s/{RW}/${RW}/g"'
# COLORIZE Usage:
# command |${COLORIZE} ${LOWS} ${HIGHS} ${REVLOWS} ${REVHIGHS}

set +a
}

2. egrepi

e a função egrepi, eficaz e elegante: ciclo de cores entre 8 ou mais cores (suas necessidades) E testado em 3 diferentes sistemas operacionais unix, com comentários:


# egrepi() egrep with 8 REVERSE cyclic colorations on regexps almost like egrep
# egrepi 
# current script will work for KSH88, KSH93, bash 2+, zsh, under AIX / Linux / SunOS
egrepi ()
{
args=$*
# colorList=wBcgymrN                                                # KSH93 or bash 3+, not for AIX
# set -A color                                                  # needed with older sh
color[0]=$Rw; color[1]=$RB; color[2]=$Rc; color[3]=$Rg; color[4]=$Ry; color[5]=$Rm; color[6]=$Rr; color[7]=$RN; # this is the only one AIX solution
i=0
unset argsToGrep argsSedColor argsPerlColor

for arg in ${args}
do
    [ "${arg}" == "." ] && arg=\.                              # if you wanna grep "."
    # color=R${colorList:((${RANDOM: -1:1})):1}                     # bash RANDOMized colors
    # color=R${colorList:$i:1} && let i++ && ((i==8)) && i=0                # KSH93 or bash 3+, not for AIX
    argsToGrep="${argsToGrep}${argsToGrep:+|}${arg}"
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${!color}&${w}#gI"            # AIX KSH88 do not recognise this fucking variable double expansion
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${color[$i]}&${w}#gI"         # AIX neither do include sed with Ignore case
    argsPerlColor="${argsPerlColor}${argsPerlColor:+,}s#${arg}#$n${color[$i]}$&${END}#gi"   # So: gotta use perl
    let i+=1 && ((i==8)) && i=0                             # AIX KSH88 do not recognise "let i++"
done
# egrep -i "${argsToGrep}" | sed ${argsSedColor} | egrep -v "grep|sed"              # AIX sed incompatibility with Ignore case
# (($# > 0)) && (egrep -i "${argsToGrep}" | perl -p -e ${argsPerlColor}) || cat         # this line colors & grep the words, will NOT act as "tail -f"
(($# > 0)) && (perl -p -e ${argsPerlColor}) || cat                      # this line just colors the words
}

3. Uso

comando | egrepi word1 .. wordN

    
por 07.04.2013 / 00:02
1

Você também pode querer dar uma olhada em lwatch :

tail -f /var/log/syslog | lwatch --input -

    
por 17.06.2015 / 22:52
1

Quanto aos códigos de cores, eu usaria tput:

red=$( tput -Txterm setaf 1 )
norm=$( tput -Txterm sgr0 )
bold=$( tput -Txterm bold )

Veja referência: man tput

Então:

tail -F myfile.log | sed "s/\(.ERROR.*\)/$red$bold$norm/g"
    
por 02.06.2016 / 11:12
0

grc com certeza!

personalize seus collors com regex no arquivo: ~ .grc / conf.tail (ou qualquer nome que você queira)

regexp=.*(select .*)$
colours=unchanged,cyan
=====
regexp=.*(update .*)$
colours=unchanged,bold yellow
=====
regexp=.*(insert .*)$
colours=unchanged,bold yellow
=====
regexp=.*(emp=\d+).*
colours=unchanged,reverse green
=====
regexp=.*http.*/rest/contahub.cmds.(.*?)/(\w*).*$
colours=unchanged,green,magenta
=====
regexp=.*http.*/M/.*\.(.*?Facade)/(\w*).*$
colours=unchanged,underline green,underline magenta

linha de comando:

grc -c conf.tail tail -f log/tomcat/catalina.out

resultados:

informaçõesparaconfigurarogrc: link

    
por 01.11.2016 / 23:27
0

Publica há algum tempo o utilitário Node Js - log-color-highlight

tail -f file | lch -red error warn -green success
lch -f file -red.bold error warn -underline.bgGreen success
    
por 19.08.2015 / 12:27