🐧 Edge Linux Debian · diagnostic & exploitation

Chapitre 04
Journaux avec journalctl

Objectifs du chapitre

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°NomSens
0–2emerg, alert, critcritique : systĂšme/matĂ©riel en pĂ©ril
3errerreur : un service a Ă©chouĂ©
4warningavertissement
5–6notice, infoinformation normale
7debugdé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

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

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