objectif
Suivre un fichier de log même s’il est rotaté, tout en filtrant ou colorant les lignes pertinentes, sans buffering qui retarde l’affichage.
code minimal
# suit le log malgré les rotations et filtre erreurs/avertissements
tail -F /var/log/app.log | grep --line-buffered -E 'ERROR|WARN'
utilisation
# afficher la progression des nouveaux événements avec timestamp
tail -F /var/log/app.log | awk '{ cmd="date +%Y-%m-%dT%H:%M:%S%z"; cmd | getline ts; close(cmd); print ts " " $0 }'
# compter le nombre de lignes "ERROR" en temps réel (rafraîchit à chaque ligne)
tail -F /var/log/app.log | grep --line-buffered -E 'ERROR' | awk 'BEGIN{c=0}{c++; print "errors:", c}'
# dupliquer la sortie: à l'écran et dans un fichier
tail -F /var/log/app.log | tee -a ~/app-follow.log
# filtrer des IDs spécifiques (ex: requêtes 5xx)
tail -F /var/log/nginx/access.log | awk '$9 ~ /^5[0-9][0-9]$/ { print }'
# ignorer le bruit (healthchecks)
tail -F /var/log/app.log | grep --line-buffered -v -E 'health|probe|ping'
variante(s) utile(s)
# suivre plusieurs fichiers et distinguer la source
tail -F /var/log/app1.log /var/log/app2.log | awk '{print FILENAME " | " $0}'
# coloriser les niveaux (si grep --color=always est dispo)
tail -F /var/log/app.log \
| GREP_COLOR='1;31' grep --line-buffered --color=always -E 'ERROR|$' \
| GREP_COLOR='1;33' grep --line-buffered --color=always -E 'WARN|$'
# limiter la mémoire/sortie: ne garder que les 1000 dernières lignes dans un fichier
tail -F /var/log/app.log | awk 'NR%1==0{print; fflush()} {print > "/dev/fd/3"}' 3> >(tail -n 1000 > ~/app-follow.log)
# alternative robuste sans grep (AWK seul)
tail -F /var/log/app.log | awk '/ERROR|WARN/ { print; fflush() }'
notes
-Fsuit les fichiers à travers la rotation (équivalent à--follow=name --retry).grep --line-bufferedévite le buffering, indispensable en pipeline temps réel.- utilisez
fflush()en awk pour forcer l’écriture immédiate. - pour plusieurs logs en même temps,
multitailoulnavoffrent une expérience plus riche, maistail -Freste portable et léger.