Chapitre 04
Journaux avec journalctl
Objectifs du chapitre
- Comprendre le journal systemd (journald) : un seul endroit pour tous les logs du systĂšme et des services.
- Filtrer efficacement : par unité (
-u), par priorité (-p), par temps (--since,-b), suivre en direct (-f). - Rendre le journal persistant (survivre aux reboots) et maßtriser sa rotation pour ne pas remplir le disque.
- Corréler un incident dans le temps : relier une panne du service edge à ce qui s'est passé juste avant.
1. Un journal unique pour tout le systĂšme
Sur une Debian moderne, on ne court plus aprĂšs une dizaine de fichiers dans /var/log. Le
dĂ©mon journald collecte au mĂȘme endroit : la sortie de chaque service gĂ©rĂ© par
systemd, les messages du noyau (dmesg), l'authentification, le démarrage⊠le tout indexé et
interrogeable par journalctl. Sans argument, il déroule tout, du plus ancien au plus
rĂ©cent ; on ne fait jamais ça sur un edge qui tourne depuis 87 jours â on filtre.
maint@edge-cell12:~$ journalctl -e
# -e (end) saute directement à la fin, les messages les plus récents
Jul 04 08:20:41 edge-cell12 edge-gateway[834]: OPC-UA session established (ns=3;s=Line12)
Jul 04 08:20:42 edge-cell12 edge-gateway[834]: published 128 tags to mqtt://localhost:1883
Chaque ligne de journal porte les mĂȘmes colonnes : horodatage, hostname,
identifiant du service[PID], puis le message. C'est cette régularité qui rend le
filtrage puissant : on peut trancher par n'importe laquelle de ces dimensions.
2. Filtrer par unité : -u
Le filtre le plus utile : ne voir que les lignes d'un service.
maint@edge-cell12:~$ journalctl -u edge-gateway -e
Jul 04 08:03:09 edge-cell12 systemd[1]: Starting Edge Gateway (OPC-UA â MQTT)...
Jul 04 08:03:11 edge-cell12 docker[21874]: Error: port 1883 already allocated
Jul 04 08:03:11 edge-cell12 systemd[1]: edge-gateway.service: Failed with result 'exit-code'.
Jul 04 08:05:22 edge-cell12 systemd[1]: Starting Edge Gateway (OPC-UA â MQTT)...
Jul 04 08:05:24 edge-cell12 edge-gateway[834]: OPC-UA session established
On lit toute la vie du service : l'échec de 08:03 (port occupé), puis la reprise réussie de 08:05.
C'est exactement le fil qu'on veut aprÚs un systemctl status ⊠failed (chapitre 3).
Sur un edge, les logs applicatifs sont souvent doubles : journalctl -u edge-gateway
montre ce que systemd et le lanceur voient, mais l'intérieur du conteneur se lit plutÎt avec
docker logs (chapitre 6). Les deux sont complémentaires : journald pour
« le service a-t-il démarré/planté ? », docker logs pour « que dit
l'application à l'intérieur ? ».
3. Filtrer par priorité : -p
Chaque message porte une priorité (niveau de gravité, hérité de syslog), de 0 (le plus grave) à 7 (le plus verbeux) :
| N° | Nom | Sens |
|---|---|---|
| 0â2 | emerg, alert, crit | critique : systĂšme/matĂ©riel en pĂ©ril |
| 3 | err | erreur : un service a échoué |
| 4 | warning | avertissement |
| 5â6 | notice, info | information normale |
| 7 | debug | détail de mise au point |
-p err ne garde que le niveau err et au-dessus (donc err, crit, alert, emerg) â
la façon la plus rapide de voir « qu'est-ce qui a vraiment cloché » :
maint@edge-cell12:~$ journalctl -p err -b
Jul 04 08:03:11 edge-cell12 docker[21874]: Error: port 1883 already allocated
Jul 04 06:14:55 edge-cell12 kernel: EXT4-fs warning: ext4_dx_add_entry: Directory index full
4. Filtrer par temps : -b, --since
Le temps est la dimension reine du diagnostic. Deux outils :
Par démarrage : -b
maint@edge-cell12:~$ journalctl --list-boots | tail -3
-2 8f3c... Tue 2026-04-08 06:13:40 CESTâ...
-1 a10d... Fri 2026-06-20 22:01:11 CESTâ...
0 7a1e... Sat 2026-07-04 06:14:02 CESTâSat 2026-07-04 08:22:10 CEST
journalctl -b= journal depuis le dernier dĂ©marrage (le boot courant, index 0).journalctl -b -1= le boot prĂ©cĂ©dent â prĂ©cieux pour voir ce qui s'est passĂ© juste avant un redĂ©marrage inattendu.
Par fenĂȘtre : --since / --until
maint@edge-cell12:~$ journalctl -u edge-gateway --since "08:00" --until "08:10"
maint@edge-cell12:~$ journalctl --since "2 hours ago" -p warning
maint@edge-cell12:~$ journalctl --since yesterday -u chronyd
--since accepte l'heure, la date, ou des expressions humaines ("2 hours ago",
yesterday, "09:15"). C'est ce qui permet de zoomer sur la minute d'un
incident.
5. Suivre en direct : -f
Pour observer un service pendant qu'on agit (redémarrage, test), on suit le journal en temps réel,
comme un tail -f :
maint@edge-cell12:~$ journalctl -u edge-gateway -f
Jul 04 08:24:01 edge-cell12 edge-gateway[834]: published 128 tags to mqtt://localhost:1883
Jul 04 08:24:03 edge-cell12 edge-gateway[834]: published 128 tags to mqtt://localhost:1883
^C (Ctrl-C pour arrĂȘter de suivre)
Le combo gagnant pour tester une remise en route : ouvrir journalctl -u edge-gateway -f
dans une session, et lancer sudo systemctl restart edge-gateway dans une autre. Tu vois
dĂ©filer en direct l'arrĂȘt, le redĂ©marrage et le rĂ©tablissement (ou l'Ă©chec) â bien plus parlant qu'un
status figé.
6. Rendre le journal persistant
Par défaut, sur certaines installations, journald garde ses logs en RAM (dans
/run/log/journal) â ils disparaissent Ă chaque reboot. Pour un edge, c'est un handicap :
aprÚs un redémarrage nocturne inexpliqué, on n'a plus rien pour comprendre. On rend le journal
persistant sur disque :
maint@edge-cell12:~$ journalctl --disk-usage
Archived and active journals take up 48.0M in the file system.
# S'il répond « in /run/... », c'est volatile. On persiste :
maint@edge-cell12:~$ sudo mkdir -p /var/log/journal
maint@edge-cell12:~$ sudo systemd-tmpfiles --create --prefix /var/log/journal
# ou : Storage=persistent dans /etc/systemd/journald.conf, puis restart systemd-journald
7. Rotation : ne pas remplir le disque
Un journal persistant qui grossit sans limite finit par⊠remplir le disque â la panne nÂș 1 du
chapitre 1. On borne sa taille dans /etc/systemd/journald.conf :
# /etc/systemd/journald.conf â bornes de taille
[Journal]
Storage=persistent
SystemMaxUse=500M # le journal ne dépassera pas 500 Mo au total
SystemMaxFileSize=50M # chaque fichier segment plafonne Ă 50 Mo
MaxRetentionSec=1month # et on ne garde pas plus d'un mois
On peut aussi purger Ă la demande :
maint@edge-cell12:~$ sudo journalctl --vacuum-size=200M # réduit à 200 Mo
maint@edge-cell12:~$ sudo journalctl --vacuum-time=2weeks # efface plus vieux que 2 semaines
Attention au piĂšge inverse : sur un edge Ă faible disque, un service applicatif trop
bavard (qui logue chaque cycle) peut, mĂȘme avec la rotation, Ă©craser en continu les logs utiles â
tu perds les erreurs importantes noyées sous le bruit, ou la rotation efface le passé en quelques
heures. Deux réponses : réduire la verbosité de l'application, et pour les conteneurs, borner leurs
logs Docker (option max-size, chapitre 6) séparément du journal systemd.
8. Corréler un incident dans le temps
Le vrai pouvoir de journald : mettre cĂŽte Ă cĂŽte, Ă la mĂȘme minute, ce qu'ont dit tous les services. ScĂ©nario : le service edge est tombĂ© Ă 08:03 ; qu'y avait-il autour ?
maint@edge-cell12:~$ journalctl --since "08:02" --until "08:04"
Jul 04 08:02:58 edge-cell12 systemd[1]: Stopping Docker Application Container Engine...
Jul 04 08:03:01 edge-cell12 kernel: Out of memory: Killed process 811 (mqtt-broker)
Jul 04 08:03:11 edge-cell12 docker[21874]: Error: port 1883 already allocated
Jul 04 08:03:11 edge-cell12 systemd[1]: edge-gateway.service: Failed with result 'exit-code'.
Sans filtre par unité, on voit la chaßne causale : le noyau a tué le broker MQTT
par manque de mĂ©moire (08:03:01), ce qui a laissĂ© le port 1883 dans un Ă©tat bancal, d'oĂč l'Ă©chec du
redĂ©marrage (08:03:11). La cause racine n'est pas « port occupĂ© » mais « OOM » â on ne
l'aurait pas vue en filtrant seulement sur edge-gateway. Ălargir la fenĂȘtre, croiser
les services : c'est lĂ que le diagnostic se joue.
CĂŽtĂ© S7-1500, le tampon de diagnostic (buffer de diag dans TIA) joue exactement ce rĂŽle : un journal horodatĂ© des Ă©vĂ©nements du CPU (dĂ©fauts, passages STOP, alarmes). La dĂ©marche est identique â on lit le buffer autour de l'heure de l'incident. L'edge et l'automate ont chacun leur journal ; un bon diagnostic croise souvent les deux, Ă condition qu'ils soient Ă la mĂȘme heure â d'oĂč l'importance du NTP, prochain chapitre.
Récapitulatif
- journald centralise tous les logs ; on interroge avec
journalctl, toujours en filtrant. - Filtres clés :
-u <unitĂ©>(service),-p err(gravitĂ©),-b/-b -1(boot courant/prĂ©cĂ©dent),--since/--until(fenĂȘtre),-f(suivi direct),-e(aller Ă la fin). - Rendre le journal persistant (
/var/log/journal,Storage=persistent) pour survivre aux reboots. - Borner sa taille (
SystemMaxUse,--vacuum-size) pour ne pas remplir le disque. - Diagnostic : Ă©largir la fenĂȘtre temporelle et croiser les services rĂ©vĂšle la chaĂźne causale (ex. un OOM qui provoque un « port occupĂ© » en aval).
Exercices
Exercice 1 â Les erreurs depuis le dernier boot
Tu arrives sur un edge et veux, en une commande, ne voir que les erreurs survenues depuis le dernier démarrage. Laquelle ?
Voir la solution
$ journalctl -p err -b
-p err garde err et au-dessus ; -b limite au boot courant. C'est le
premier coup d'Ćil « quelque chose a-t-il cassĂ© depuis qu'on a dĂ©marrĂ© ? ». Pour inclure
le boot précédent (utile aprÚs un reboot surprise) : journalctl -p err -b -1.
Exercice 2 â Que s'est-il passĂ© juste avant le reboot ?
L'edge a redémarré tout seul cette nuit. Tu veux lire les toutes derniÚres lignes de journal d'avant le redémarrage. Comment ?
Voir la solution
$ journalctl --list-boots # repérer l'index du boot d'avant (-1)
$ journalctl -b -1 -e # fin du journal du boot précédent
$ journalctl -b -1 -p warning # ou seulement warnings+erreurs
Cela suppose que le journal est persistant (§6) : sinon, le journal du boot
précédent a disparu au redémarrage et --list-boots ne montre que le boot courant. C'est
exactement la situation qui justifie de persister le journal sur un edge.
Exercice 3 â Le disque se remplit de logs
df -h montre / Ă 95 %, et journalctl --disk-usage annonce
6 Go de journaux. Que fais-tu dans l'immédiat, puis pour que ça ne se reproduise pas ?
Voir la solution
ImmĂ©diat â rĂ©cupĂ©rer de la place sans tout perdre :
$ sudo journalctl --vacuum-size=500M
Durable â borner dans /etc/systemd/journald.conf :
SystemMaxUse=500M (+ éventuellement MaxRetentionSec=1month), puis
sudo systemctl restart systemd-journald. Et si la cause est un conteneur bavard, borner
aussi ses logs Docker (chapitre 6). On traite Ă la fois le symptĂŽme (place) et la cause
(volume de logs).