16 - Les logs : lire, filtrer, comprendre
Ce que tu vas apprendre
- Utiliser journalctl pour naviguer dans les logs systemd
- Connaitre les fichiers classiques de /var/log/
- Filtrer les logs par service, date, priorité
- Suivre les logs en temps réel avec tail -f et less +F
- Configurer logrotate pour éviter que les logs mangent ton disque
- Chercher dans les logs avec grep et awk
Prerequisites
Maitriser les bases du terminal et connaître systemd.
La première fois que j'ai du debugger un problème en production, j'ai fait un cat sur un fichier de log de 2 Go. Mon terminal a freeze, ma connexion SSH a lache, et le serveur n'etait pas content non plus. Depuis, j'ai appris a lire les logs correctement. Et crois-moi, ca change tout.
journalctl : les logs de systemd
Sur un système avec systemd, journalctl est ton outil principal. Il centralise les logs de tous les services, du kernel et des messages système :
bash# Voir tous les logs (attention, c'est verbeux)
journalctl
# Les logs de la session en cours
journalctl -b
# Les logs du boot precedent
journalctl -b -1
# Suivre les logs en temps reel
journalctl -f
Filtrer par service
C'est la que journalctl devient vraiment utile :
bash# Les logs d'un service precis
journalctl -u nginx
# Plusieurs services a la fois
journalctl -u nginx -u postgresql
# Suivre les logs d'un service en temps reel
journalctl -u mon-app -f
Filtrer par date
bash# Depuis une date precise
journalctl --since "2026-03-28 14:00"
# Les dernieres 2 heures
journalctl --since "2 hours ago"
# Entre deux dates
journalctl --since "2026-03-28" --until "2026-03-29"
# Depuis le dernier boot
journalctl --since today
Filtrer par priorité
Les niveaux de priorité syslog vont de 0 (urgence) a 7 (debug) :
bash# Uniquement les erreurs et plus grave
journalctl -p err
# Erreurs et warnings
journalctl -p warning
# Les niveaux : emerg, alert, crit, err, warning, notice, info, debug
journalctl -p err --since "1 hour ago" -u nginx
Sur paltemps.fr, je combine souvent -p err --since "1 hour ago" pour voir rapidement si quelque chose a casse recemment.
Format de sortie
bash# Format JSON (pratique pour parser)
journalctl -u nginx -o json-pretty --since "1 hour ago"
# Format court (sans metadata)
journalctl -u nginx -o short
# Afficher seulement les N derniers messages
journalctl -u nginx -n 50
/var/log/ : les fichiers classiques
Meme avec journalctl, certains logs se trouvent encore dans des fichiers :
bash# Lister les fichiers de log
ls -lh /var/log/
# Fichiers courants :
# /var/log/syslog - Messages systeme generaux (Debian/Ubuntu)
# /var/log/messages - Equivalent sur RHEL/CentOS
# /var/log/auth.log - Connexions, sudo, SSH
# /var/log/kern.log - Messages du kernel
# /var/log/dpkg.log - Historique des installations apt
# /var/log/nginx/ - Logs du serveur web
# /var/log/postgresql/ - Logs de la base de donnees
/var/log/auth.log est un fichier que je consulte systématiquement quand je suspecte des tentatives d'intrusion. On y voit chaque connexion SSH, chaque sudo, chaque échec d'authentification.
Lire les logs sans planter ton terminal
Ne fais jamais cat sur un gros fichier de log. Utilise plutot :
bash# Les 100 dernieres lignes
tail -100 /var/log/syslog
# Suivre en temps reel (Ctrl+C pour arreter)
tail -f /var/log/syslog
# Suivre plusieurs fichiers a la fois
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# less avec suivi en temps reel (F pour suivre, Ctrl+C puis q pour quitter)
less +F /var/log/syslog
less +F est mon outil préféré. Tu suis les logs en temps réel, et quand tu vois quelque chose d'interessant, tu appuies sur Ctrl+C pour passer en mode navigation, tu cherches avec /, puis tu appuies sur F pour reprendre le suivi.
grep et awk : chercher dans les logs
bash# Chercher une erreur specifique
grep "error" /var/log/syslog
# Chercher en ignorant la casse
grep -i "failed" /var/log/auth.log
# Avec du contexte (3 lignes avant et apres)
grep -C 3 "out of memory" /var/log/syslog
# Compter les occurrences
grep -c "Failed password" /var/log/auth.log
# Extraire les IPs qui tentent du brute force
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
Cette dernière commande est une de celles que j'utilise le plus. Elle extrait les adresses IP des tentatives de connexion echouees, les compte et les trie. En cinq secondes, tu sais qui essaie de s'introduire sur ton serveur.
logrotate : éviter la saturation disque
Sans rotation, les logs grossissent indefiniment. logrotate s'en occupe :
bash# Configuration globale
cat /etc/logrotate.conf
# Configurations specifiques par service
ls /etc/logrotate.d/
Un fichier de configuration typique :
# /etc/logrotate.d/mon-app
/var/log/mon-app/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload mon-app > /dev/null 2>&1 || true
endscript
}
Les options importantes :
daily,weekly,monthly: fréquence de rotationrotate 14: garder les 14 derniers fichierscompress: compresser les vieux logs en .gzdelaycompress: ne pas compresser le fichier le plus recent (utile si le service écrit encore dedans)missingok: ne pas planter si le fichier n'existe paspostrotate: commande a exécuter apres la rotation
bash# Tester la configuration sans rien faire
logrotate -d /etc/logrotate.d/mon-app
# Forcer une rotation manuellement
sudo logrotate -f /etc/logrotate.d/mon-app
Résumé
journalctl -u service -fpour suivre les logs d'un service en directjournalctl -p err --since "1 hour ago"pour trouver les erreurs recentes- Ne fais jamais
catsur un gros log, utilisetail,less +Fougrep /var/log/auth.logpour la sécurité,/var/log/syslogpour le systèmelogrotateempeche les logs de remplir ton disquegrep+awk+sort+uniq -cpour analyser les patterns dans les logs
Article précédent : Les taches planifiees avec cron Article suivant : Le stockage et les disques