Lire les logs

Objectifs

  • Comprendre ce que sont les logs

  • Savoir trouver les fichiers de logs

  • Savoir consulter les logs d'un service

DéfinitionLes 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.

1
$ ls /var/log/
2
alternatives.log  boot.log         cups        dpkg.log        fsck       lastlog    mail.warn   runit     tallylog             vbox-setup.log  
3
apache2           bootstrap.log    daemon.log  exim4           hp         lpr.log    messages    samba     tor                  wtmp            
4
apt               borg-backup.log  debug       faillog         installer  mail.err   ntpstats    slim.log  ufw.log              Xorg.0.log      
5
aptitude          btmp             dibbler     firebird        journal    mail.info  private     snort     unattended-upgrades  
6
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éfinitionSyslog

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éthodeSyslog 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.

1
$ tail /var/log/syslog 
2
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"
3
Dec 14 16:13:08 europa systemd[1]: Starting Collect apt metrics for prometheus-node-exporter...
4
Dec 14 16:13:08 europa systemd[1]: Starting Collect SMART metrics for prometheus-node-exporter...
5
Dec 14 16:13:08 europa systemd[1]: prometheus-node-exporter-smartmon.service: Succeeded.
6
Dec 14 16:13:08 europa systemd[1]: Finished Collect SMART metrics for prometheus-node-exporter.
7
Dec 14 16:13:09 europa systemd[1]: prometheus-node-exporter-apt.service: Succeeded.
8
Dec 14 16:13:09 europa systemd[1]: Finished Collect apt metrics for prometheus-node-exporter.
9
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"
10
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"
11
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) et prometheus-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.

1
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).

1
journalctl -b

Il est même possible d'être plus précis, et de demander les logs d'une durée spécifique

1
journalctl --since "1 hour ago"
1
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.