← retour aux snippets

tail: suivre des logs et filtrer en temps réel

Suivre un fichier de log avec rotation et filtrer les événements importants sans perdre de lignes.


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

  • -F suit 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, multitail ou lnav offrent une expérience plus riche, mais tail -F reste portable et léger.