Coloration de différentes sources pour la queue


19

Je regarde différents journaux par

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

Comment puis-je colorer différemment la sortie de chaque journal?



@MattBianco merci, je vais voir multitailet les réponses à cette question
— Daniel W.

1
En plus des bonnes réponses ci-dessous, vous pouvez également consulter unix.stackexchange.com/questions/26313/colored-find-output qui montre comment faire beaucoup plus avec la colorisation des fichiers de sortie.
— Joe

Réponses:


21

Utiliser GNU greppour la coloration:

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)

Notez que les 2 premiers sont démarrés en arrière-plan. Cela signifie qu'ils ne seront pas tués si vous appuyez sur Ctrl-C(le shell ignore explicitement SIGINT pour les travaux asynchrones).

Pour éviter cela, vous pouvez faire à la place:

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

De cette façon, Ctrl-Cle dernier tail+grepet le dernier cat(du SIGINT) et les deux autres queues grep + mourront d'un SIGPIPE la prochaine fois qu'ils écrivent quelque chose.

Ou restaurez le gestionnaire SIGINT (ne fonctionnera pas avec tous les 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)

Vous pouvez également le faire dans la colorfonction. Cela ne s'appliquera pas tail, mais tailmourra d'un SIGPIPE la prochaine fois qu'il écrit s'il grepmeurt.

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 faites de l'ensemble queue + grep une fonction:

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 le tout:

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

Lorsque je mets cela dans mon script "watch.sh", il revient à ma console mais les messages sont imprimés, voir i.imgur.com/yaiBwMo.png
— Daniel W.

@Dan, voir le montage
— Stéphane Chazelas

Merci pour vos efforts en écrivant cette réponse, je suis allé avec la tailcfonction qui fonctionnait le mieux et qui semble la plus intuitive dans le script.
— Daniel W.

4

Quelque chose comme ça a fonctionné pour moi:

(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}')

Explication:

  • tail -f file: ajouter des données à mesure que le fichier grandit
  • awk -W interactive: passer awken mode interactif
  • '{printf "\033[1;31m%s\033[0m\n", $0}' imprimer la sortie colorisée sur le terminal.
  • \033[1;31m signifie rouge
  • \033[1;32m signifie vert
  • \033[1;34m signifie bleu

-W interactivesemble être mawkspécifique. (la façon dont la mawkmémoire tampon de son entrée par défaut est également unique et -W interactivene serait pas nécessaire dans d'autres awkimplémentations).
— Stéphane Chazelas
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.