Lire les logs
Objectifs
Comprendre ce que sont les logs
Savoir trouver les fichiers de logs
Savoir consulter les logs d'un service
Définition : Les logs
Les logs sont des messages produits par les programmes pour donner des informations sur leur état de fonctionnement et/ou les erreurs qui surviennent lors de l'exécution.
Les différents programmes ou services du système d'exploitation peuvent écrire des logs qui seront consultables de différentes manières. La plupart se trouvent dans un dossier nommé /var/log
, mais certains sont gérés par Systemd.
Exemple :
Dans le dossier /var/log
d'une machine, on constate qu'il y a de nombreux fichiers et dossiers pour contenir les logs de différents types.
$ ls /var/log/
alternatives.log boot.log cups dpkg.log fsck lastlog mail.warn runit tallylog vbox-setup.log
apache2 bootstrap.log daemon.log exim4 hp lpr.log messages samba tor wtmp
apt borg-backup.log debug faillog installer mail.err ntpstats slim.log ufw.log Xorg.0.log
aptitude btmp dibbler firebird journal mail.info private snort unattended-upgrades
auth.log cron.log dmesg fontconfig.log kern.log mail.log prometheus syslog user.log
Il n'est pas important de savoir à quoi sert chaque fichier de log. Ils portent généralement un nom explicite (celui du service ou du logiciel).
Définition : Syslog
Pour faciliter le traitement des messages de tout les programmes existant, un protocole existe : Syslog. C'est un protocole qui définit aussi bien la manière d'envoyer des messages de logs entre différents programmes que le format standardisé que doivent avoir des messages.
Méthode : Syslog et rsyslog
Sous Linux, un fichier /var/log/syslog
va contenir tout les logs échangés sur la machine en utilisant le protocole Syslog. Généralement, le service ne charge de la gestion de ces messages est le service rsyslog
.
$ tail /var/log/syslog
Dec 14 16:12:18 europa prometheus-node-exporter[1564]: level=error ts=2020-12-14T15:12:18.884Z caller=collector.go:161 msg="collector failed" name=rapl duration_seconds=0.005177803 err="open /sys/class/powercap/intel-rapl:0/energy_uj: permission denied"
Dec 14 16:13:08 europa systemd[1]: Starting Collect apt metrics for prometheus-node-exporter...
Dec 14 16:13:08 europa systemd[1]: Starting Collect SMART metrics for prometheus-node-exporter...
Dec 14 16:13:08 europa systemd[1]: prometheus-node-exporter-smartmon.service: Succeeded.
Dec 14 16:13:08 europa systemd[1]: Finished Collect SMART metrics for prometheus-node-exporter.
Dec 14 16:13:09 europa systemd[1]: prometheus-node-exporter-apt.service: Succeeded.
Dec 14 16:13:09 europa systemd[1]: Finished Collect apt metrics for prometheus-node-exporter.
Dec 14 16:13:18 europa prometheus-node-exporter[1564]: level=error ts=2020-12-14T15:13:18.880Z caller=collector.go:161 msg="collector failed" name=rapl duration_seconds=0.000294815 err="open /sys/class/powercap/intel-rapl:0/energy_uj: permission denied"
Dec 14 16:14:18 europa prometheus-node-exporter[1564]: level=error ts=2020-12-14T15:14:18.891Z caller=collector.go:161 msg="collector failed" name=rapl duration_seconds=0.002966102 err="open /sys/class/powercap/intel-rapl:0/energy_uj: permission denied"
Dec 14 16:15:18 europa prometheus-node-exporter[1564]: level=error ts=2020-12-14T15:15:18.890Z caller=collector.go:161 msg="collector failed" name=rapl duration_seconds=0.000811931 err="open /sys/class/powercap/intel-rapl:0/energy_uj: permission denied"
Ce fichier est un bon point d'entrée pour investiguer un problème sur la machine. Chaque ligne représente un log avec le format suivant :
la date où le log a été émis ;
le nom de la machine (ici
europa
), le protocole Syslog permet de centraliser les logs de plusieurs machines au même endroit si besoin ;le nom du processus qui a émis le log, et son PID entre crochet. Ici on voit des logs émis par
systemd
(PID 1) etprometheus-node-exporter
(PID 1564) ;le message effectivement émis par le programme.
Journald
Systemd s'accompagne d'un service, journald
, qui gère les logs de tout les services de la machine. En fait, lorsque l'on utilise la commande systemctl status SERVICE
on peut observer une partie des logs les plus récents du service, gérés par journald
.
Méthode :
La commande journalctl
qui va avec journald
permet de consulter des logs de manière plus pratique que de simplement regarder dans des fichiers de logs. Par exemple elle permet de n'obtenir les messages de logs que d'un service en particulier.
journalctl -u cron
On peut aussi lister tout les logs, mais uniquement pour depuis l'allumage de la machine (et non ceux des précédentes sessions d'utilisation).
journalctl -b
Il est même possible d'être plus précis, et de demander les logs d'une durée spécifique
journalctl --since "1 hour ago"
journalctl --since "2020-12-01 20:15:00" --until "2020-12-10 14:21:42"
Enfin ajouter l'option -f
permet d'afficher en direct les nouveaux logs produits. Très utile lors d'une phase de debug.
À retenir
Tout les programmes produisent des messages pour donner des informations sur leur état de fonctionnement. Ces messages sont écrits dans le dossier /var/log
de la machine, mais peuvent être consultés de manière plus ergonomique, dans le cas des services, à l'aide de la commande journalctl
.