Menu Fermer

Comment utiliser journalctl pour voir et lire les journaux Linux Systemd

Sur Linux, les journaux (logs) sont une partie importante du système car elles vous permet d’audit, surveiller le système.
On peut aussi les utiliser pour dépanner le système ou un service qui ne fonctionne pas correctement.
Linux créé par défaut beaucoup de journaux (syslog, messages, auth, daemon, …) dans le répertoire /var/log.
Cette journalisation centralisée s’effectue à travers SystemD qui recueille et stocke des données de journalisation des noyaux, des messages de journal système, une sortie standard et une erreur pour les divers services.
Plus particulièrement, c’est le daemon journald qui gère les sources des journaux pour une sortie format syslog, JSON, …

Enfin la commande journalctl permet à l’administrateur d’interroger et consulter les journaux.
Elle permet aussi de manipuler les journaux, comme par exemple vider les journaux.
journalctl est donc important à connaître pour le débogage du système.

Dans ce tutoriel, je vous explique comment utiliser la commande journalctl afin de voir et manipuler les journaux Systemd.

Comment utiliser journalctl pour voir et lire les journaux Linux Systemd

Comment utiliser journalctl pour voir et manipuler les journaux Systemd

Comment consulter les journaux Linux avec journalctl

Enfin de commencer, il est judicieux de comprendre ce qu’est SystemD en suivant ce tutoriel :

La commande par défaut affiche tous les journaux.
Bien entendu, on peut appliquer toutes sortes d’options pour filtrer les journaux sur une date, un service en particulier.

journalctl

Cela va retourner beaucoup de lignes.
JournalCtl utilise la commande less pour vous montrer les journaux.
Ce qui signifie que vous pouvez utiliser les mêmes raccourcis clavier pour vous déplacer dans les journaux que vous le faites avec la commande less.

Consulter les journaux Linux avec journalctl

Si vous ne voulez pas que les journaux soient affichés avec less, utilisez l’option –no-pager :

journalctl --no-pager

Cela permet notamment d’utiliser la commande grep pour filtrer.

Afficher les journaux en inversé

Comme vous l’avez remarqué, les journaux sont montrés dans l’ordre chronologique. Cela signifie que les journaux stockés les plus anciens sont affichés en premier.
Si vous souhaitez d’abord voir les journaux récents, vous pouvez afficher les journaux de journal dans l’ordre inverse avec l’option -r:

journalctl -r

Lire le journal de démarrage du système linux

Pour afficher les journaux du dernier démarrage de Linux (boot) :

journalctl -b

Pour afficher la liste des journaux de démarrages disponibles :

journalctl --list-boots

Cela retourne la liste des journaux disponible avec un identifiant :

-2 ezsdfzeerg8fds9qger4ger8ede9ver Sun 2021-08-08 22:12:23 UTC—Mon 2021-08-08 22:12:23 UTC
-1 e5f4ds5ferhtrh4tyj5trez6ezfer8d Mon 2021-08-09 11:22:13 UTC—Mon 2021-08-09 11:22:13 UTC
0 cf61e3c7347b41308468e0431ee77ade Mon 2021-08-09 16:39:41 UTC—Mon 2021-08-09 16:42:27 UTC

Pour voir les journaux du démarrage précédent de Linux, on utilise l’option -b=-X.
Réduisez le chiffre pour remontrer aux journaux des boots précédents selon les disponibilités.
Par exemple :

journalctl -b=-1

Notez que l’on peut aussi afficher les logs du démarrage de Linux via l’identifiant :

journalctl -b e5f4ds5ferhtrh4tyj5trez6ezfer8d

Filtrer les journaux sur le temps

Mais on peut aussi remonter dans les logs précédents pour un service en particulier grâce à l’option -S (Since).
Par exemple, vous pouvez visualiser les journaux du jour, de la veille, 1h ou deux jours avant.

journalctl -S today
journalctl -S yesterday
journalctl --since "5 minutes ago"
journalctl --since "25 minutes ago"
journalctl -S "1 hour ago"
journalctl -S "2 days ago"

Enfin vous pouvez spécifier un intervalle de date avec l’option -S (since) et -U (until).

journalctl -S "2020-01-16 18:00:00" -U "2020-01-17 23:00:00"

Notez que l’on peut aussi utiliser les options avec le nom complet, par exemple :

journalctl --since=yesterday --until=now

Afficher les journaux d’un daemon

Vous pouvez filtrer les journaux pour n’afficher que les logs d’un daemon et service spécifique.
Par exemple, pour ne voir que les journaux du service ssd avec l’option -u (pour unit) :

journalctl -u ssh

Ou encore pour afficher les journaux de nginx :

journalctl -u nginx

Au besoin pour lister les units :

systemctl list-dependencies

Bien entendu, on peut combiner avec les options précédentes :

sudo journalctl -u ssh --since=yesterday
sudo journalctl -u ssh -b0

On peut aussi filtrer les logs par GID.
Pour afficher les GID :

journalctl -F _GID
1000
65534
0
115
112

Puis on utilise l’option _GID pour filtrer sur ce dernier.

journalctl _GID=115
-- Logs begin at Mon 2021-08-09 16:39:41 UTC, end at Tue 2021-08-10 07:31:56 UTC. --
Aug 09 16:39:55 ns320684 mysqld[622]: 2021-08-09 16:39:55 0 [Note] /usr/sbin/mysqld (mysqld 10.3.29-MariaDB-0+deb10u1) starting as process 622 ...

Filtrer les journaux sur un exécutable :

journalctl /usr/bin/sudo
-- Logs begin at Mon 2021-08-09 16:39:41 UTC, end at Tue 2021-08-10 07:32:40 UTC. --
Aug 09 16:42:27 ns320684 sudo[1074]:   debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ; COMMAND=/usr/bin/journalctl --list-boots
Aug 09 16:42:27 ns320684 sudo[1074]: pam_unix(sudo:session): session opened for user root by debian(uid=0)
Aug 09 16:42:27 ns320684 sudo[1074]: pam_unix(sudo:session): session closed for user root
Aug 10 07:16:52 ns320684 sudo[19215]:   debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ; COMMAND=/usr/bin/journalctl --vacuum-time=2d
Aug 10 07:16:52 ns320684 sudo[19215]: pam_unix(sudo:session): session opened for user root by debian(uid=0)
Aug 10 07:16:52 ns320684 sudo[19215]: pam_unix(sudo:session): session closed for user root
Aug 10 07:16:57 ns320684 sudo[19218]:   debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ; COMMAND=/usr/bin/journalctl --vacuum-time=1d
Aug 10 07:16:57 ns320684 sudo[19218]: pam_unix(sudo:session): session opened for user root by debian(uid=0)
Aug 10 07:16:57 ns320684 sudo[19218]: pam_unix(sudo:session): session closed for user root

Filtrer les journaux sur un utilisateur

On récupérer l’ID de l’utilisateur avec la commande id :

[email protected]:~$ id -u debian
1000

Puis pour filtrer les journaux sur un utilisateur sur les 25 dernières minutes :

[email protected]:~$ journalctl _UID=1000 --since "25 minutes ago"
-- Logs begin at Mon 2021-08-09 16:39:41 UTC, end at Tue 2021-08-10 07:33:29 UTC. --
Aug 10 07:11:58 ns320684 systemd[19113]: Listening on GnuPG cryptographic agent and passphrase cache (restricted).
Aug 10 07:11:58 ns320684 systemd[19113]: Listening on GnuPG cryptographic agent (ssh-agent emulation).
Aug 10 07:11:58 ns320684 systemd[19113]: Listening on GnuPG cryptographic agent and passphrase cache (access for web browsers).
Aug 10 07:11:58 ns320684 systemd[19113]: Reached target Timers.
Aug 10 07:11:58 ns320684 systemd[19113]: Listening on GnuPG cryptographic agent and passphrase cache.
Aug 10 07:11:58 ns320684 systemd[19113]: Listening on GnuPG network certificate management daemon.
Aug 10 07:11:58 ns320684 systemd[19113]: Reached target Sockets.
Aug 10 07:11:58 ns320684 systemd[19113]: Reached target Paths.
Aug 10 07:11:58 ns320684 systemd[19113]: Reached target Basic System.
Aug 10 07:11:58 ns320684 systemd[19113]: Reached target Default.
Aug 10 07:11:58 ns320684 systemd[19113]: Startup finished in 28ms.

Visualiser les journaux du noyau Linux

Pour afficher les journaux du noyaux Linux (kernel), équivaut à la commande dmesg :

journalctl -k

Afficher les erreurs dans les journaux

Afficher les erreurs dans les journaux-p 3 signifie priorité ERR, -X fournit des informations de message supplémentaires et -b signifie depuis le dernier démarrage.

journalctl -p 3 -xb
Afficher les erreurs dans les journaux avec journalctl

Il s’agit en fait de filtrer sur les niveaux de priorité :

PrioritéCode
0emerg
1alert
2crit
3err
4warning
5notice
6info
7debug
Les priorités des journaux Linux

L’option -p prenant les intervalles de priorité, par exemple pour avoir les alertes, critiques, erreur et warning :

journalctl -p 1..3

Afficher les journaux d’un service/daemon en particulier

Pour afficher les erreurs des journaux pour un service en particulier, utilisez l’option -u :

journalctl -u sshd.service
Afficher les journaux d'un service/daemon en particulier avec journalctl

Filtrer sur un service avec l’option –no-pager et en récupérant les erreurs :

journalctl -u docker.service --no-pager | grep -i error

Utiliser l’option tail avec journalctl

Afficher les 100 lignes de Systemd Logs pour un service particulier (Equiv. Tail-N 100):

sudo journalctl -u nginx -n 100 --no-pager

Suivez les journaux SystemD pour le service (Equiv. Tail -F).
Les nouvelles lignes du journal pour le service vont alors s’afficher au fur et à mesure.

sudo journalctl -u nginx -f

Pour afficher les derniers journaux :

journalctl -xe

Changer le format de sortie

L’option -o permet de modifier le format de sortie.
Par exemple pour afficher les journaux au format JSON :

journalctl -b -u nginx -o json

Journalctl gère plusieurs format dont :

  • cat : texte plein
  • export : un format binaire adapté au transfert ou à la sauvegarde de données.
  • json : en JSON
  • json-pretty : JSON formaté pour une meilleure lisibilité par l’homme
  • json-sse : résultat formaté sous JSON enveloppé pour que l’événement add server-sen soit compatible
  • short : la sortie de style syslog par défaut
  • short-iso : affiche les horodatages d’horloge murale ISO 8601
  • short-monotonic : le format par défaut avec des horodatages monotones.
  • short-precise : le format par défaut avec précision à la microseconde près
  • verbose : affiche chaque champ de journal disponible pour l’entrée, y compris ceux généralement cachés en interne.

Visualiser l’espace disque utilisé par les journaux

journalctl --disk-usage

Fixer la taille et le nombre de journaux

Vous pouvez limiter le nombre de fichiers journaux d’archive. Disons que vous voulez avoir seulement cinq fichiers journaux.
Il supprimera les fichiers journaux d’archive les plus âgés ne laissant que le nombre spécifié de fichiers journaux.

journalctl --vacuum-files=5

Une autre façon est de limiter la taille du journal. Avec cela, il supprimera les fichiers journaux de journal jusqu’à ce que l’espace disque pris par les journaux de journal tombe en dessous de la taille que vous avez spécifiée.

sudo journalctl --vacuum-size=100M