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?

Daniel W.
la source
@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
Stéphane Chazelas
la source
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
le chaos
la source
-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