Colorir diferentes fontes de cauda


19

Estou assistindo diferentes logs

tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log

Como posso ter a saída de cada log colorida de maneira diferente?



@MattBianco obrigado, darei uma olhada multitaile as respostas nesta pergunta #
Daniel W.

1
Além das ótimas respostas abaixo, você também pode conferir unix.stackexchange.com/questions/26313/colored-find-output, que mostra como fazer muito mais com a colorização dos arquivos de saída.
Joe

Respostas:


21

Usando o GNU greppara colorir:

color() { GREP_COLOR=$1 grep --color '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

Observe que os dois primeiros são iniciados em segundo plano. Isso significa que eles não serão eliminados se você pressionar Ctrl-C(o shell ignora explicitamente o SIGINT para trabalhos assíncronos).

Para evitar isso, você pode fazer:

color() { GREP_COLOR=$1 grep --line-buffered --color=always '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33) | cat

Dessa forma, após Ctrl-Co último tail+grepe catmorrer (do SIGINT) e os outros dois grep + caudas morrerão de um SIGPIPE na próxima vez que escreverem algo.

Ou restaure o manipulador SIGINT (não funcionará com todos os shells):

color() { GREP_COLOR=$1 grep --color '.*'; }

((trap - INT; tail -qf /var/log/syslog | color 31) &
(trap - INT; tail -qf /var/log/fail2ban.log | color 32) &
tail -qf /var/log/nginx/error.log | color 33)

Você também pode fazer isso na colorfunção Isso não se aplica tail, mas tailmorrerá de um SIGPIPE na próxima vez que ele gravar se grepmorrer.

color() (trap - INT; GREP_COLOR=$1 exec grep --color '.*')

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

Ou crie uma função inteira + grep:

tailc() (trap - INT; export GREP_COLOR="$1"; shift; tail -qf -- "$@" |
   grep --color '.*')
tailc 31 /var/log/syslog &
tailc 32 /var/log/syslog &
tailc 33 /var/log/nginx/error.log

Ou a coisa toda:

tailc() (
  while [ "$#" -ge 2 ]; do
    (trap - INT; tail -f -- "$2" | GREP_COLOR=$1 grep --color '.*') &
    shift 2
  done
  wait
)

tailc 31 /var/log/syslog 32 /var/log/syslog 33 /var/log/nginx/error.log

Quando eu colocar isso em meu script "watch.sh", ele retorna ao meu console, mas as mensagens são impressos, consulte i.imgur.com/yaiBwMo.png
Daniel W.

@Dan, see the edit #
Stéphane Chazelas

Obrigado por seu esforço em escrever esta resposta, eu segui a tailcfunção que funcionou melhor e parece mais intuitiva no script.
19414 Daniel W.

4

Algo assim funcionou para mim:

(tail -f /var/log/syslog | awk -W interactive '{printf "\033[1;31m%s\033[0m\n", $0}' & \
tail -f /var/log/auth.log | awk -W interactive '{printf "\033[1;32m%s\033[0m\n", $0}' & \
tail -f /var/log/Xorg.0.log | awk -W interactive '{printf "\033[1;34m%s\033[0m\n", $0}')

Explicação:

  • tail -f file: acrescenta dados à medida que o arquivo cresce
  • awk -W interactive: definido awkpara o modo interativo
  • '{printf "\033[1;31m%s\033[0m\n", $0}' imprima a saída colorida no terminal.
  • \033[1;31m significa vermelho
  • \033[1;32m significa verde
  • \033[1;34m significa azul

-W interactiveparece ser mawkespecífico. (a maneira como mawksua entrada é armazenada em buffer por padrão também é exclusiva e -W interactivenão seria necessária em outras awkimplementações).
Stéphane Chazelas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.