Colorir diferentes fontes para a cauda

19

Estou assistindo a registros diferentes

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 de maneira diferente?

    
por DanFromGermany 19.08.2014 / 12:58

2 respostas

21

Usando o GNU grep para a coloração:

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 primeiros 2 são iniciados em segundo plano. Isso significa que eles não serão mortos se você pressionar Ctrl-C (o shell ignora explicitamente o SIGINT para tarefas assíncronas).

Para evitar isso, você pode fazer isso:

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, ao Ctrl-C , o último tail+grep e cat die (do SIGINT) e os outros dois grep + tails morrerão de um SIGPIPE na próxima vez que escreverem algo.

Ou restaure o manipulador SIGINT (não funciona 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 função color . Isso não se aplica a tail , mas tail morrerá de um SIGPIPE na próxima vez que for escrito se grep morrer.

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 faça o tail inteiro + grep uma função:

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
    
por 19.08.2014 / 13:24
4

Algo assim funcionou para mim:

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

Explicação:

  • tail -f file : anexar dados conforme o arquivo cresce
  • awk -W interactive : definir awk para o modo interativo
  • '{printf "3[1;31m%s3[0m\n", $0}' imprime a saída colorizada para o terminal.
  • 3[1;31m significa vermelho
  • 3[1;32m significa verde
  • 3[1;34m significa azul
por 19.08.2014 / 13:24