20.10. Utiliser le Journal

Journal est un composant de systemd responsable de l'affichage et de la gestion des fichiers journaux. Il peut être utilisé en parallèle ou à la place d'un démon syslog traditionnel, tel que rsyslogd. Journal a été développé pour répondre aux problèmes liés aux connexions traditionnelles. Il est étroitement intégré avec le reste du système, prend en charge diverses technologies de connexion et la gestion des accès pour les fichiers journaux.
Les données de journalisation sont collectées, stockées, et traitées par le service journald de Journal. Il crée et maintient des fichiers binaires nommés des journaux basés sur des informations de journalisation reçues du noyau, des processus utilisateur, de la sortie standard, et de la sortie d'erreurs standard des services système ou via son API native. Ces journaux sont structurés et indexés, ce qui fournit un temps de recherche relativement rapide. Les entrées de journaux peuvent comporter un identifiant unique. Le service journald collecte de nombreux champs de métadonnées pour chaque message de journal. Les fichiers journaux sont sécurisés et ne peuvent donc pas être modifiés manuellement.

20.10.1. Afficher les fichiers journaux

Pour accéder aux enregistrements de Journal, veuillez utiliser l'outil journalctl. Pour un affichage de base des journaux, veuillez saisir en tant qu'utilisateur root :
journalctl
Une sortie de cette commande est une liste de tous les fichiers journaux générés sur le système, y compris des messages générés par des composants système et par des utilisateurs. La structure de cette sortie est similaire à celle utilisée dans /var/log/messages/ mais elle offre quelques améliorations :
  • la priorité des entrées est marquée visuellement. Des lignes de priorités d'erreurs et des priorités plus élevées sont surlignées en rouge et des caractère en gras sont utilisés pour les lignes avec une notification et une priorité d'avertissement
  • les horodatages sont convertis au fuseau horaire local de votre système
  • toutes les données journalisées sont affichées, y compris les journaux rotatifs
  • le début d'un démarrage est marqué d'une ligne spéciale

Exemple 20.18. Exemple de sortie journalctl

Ci-dessous figure une exemple de sortie fourni par l'outil journalctl. Lorsqu'appelé sans paramètres, les entrées répertoriées commencent par un horodatage, puis le nom d'hôte et l'application qui ont effectué l'opération sont mentionnés suivis du message. Cet exemple montre les trois premières entrées de l'enregistrement du journal :
# journalctl
-- Logs begin at Thu 2013-08-01 15:42:12 CEST, end at Thu 2013-08-01 15:48:48 CEST. --
Aug 01 15:42:12 localhost systemd-journal[54]: Allowing runtime journal files to grow to 49.7M.
Aug 01 15:42:12 localhost kernel: Initializing cgroup subsys cpuset
Aug 01 15:42:12 localhost kernel: Initializing cgroup subsys cpu

[...]
Dans de nombreux cas, seules les dernières entrées de l'enregistrement du journal sont pertinentes. La manière la plus simple de réduire la sortie journalctl consiste à utiliser l'option -n qui répertorie uniquement le nombre spécifié des entrées les plus récentes du journal :
journalctl -n Number
Remplacez Number par le nombre de lignes à afficher. Lorsqu'aucun nombre n'est spécifié, journalctl affiche les dix entrées les plus récentes.
La commande journalctl permet de contrôler le format de la sortie avec la syntaxe suivante :
journalctl -o form
Remplacez form par un mot-clé spécifiant la forme de sortie souhaitée. Il existe plusieurs options, comme verbose, qui retourne des éléments d'entrée complètement structurés avec tous les champs, export, qui crée un courant binaire convenable aux sauvegardes et transferts réseau, et json, qui formate les entrées en tant que structures de données JSON. Pour obtenir la liste complète des mots-clés, veuillez consulter la page man de journalctl(1).

Exemple 20.19. Sortie détaillée de journalctl

Pour afficher la totalité des métadonnées concernant toutes les entrées, veuillez saisir :
# journalctl -o verbose
[...]

Fri 2013-08-02 14:41:22 CEST [s=e1021ca1b81e4fc688fad6a3ea21d35b;i=55c;b=78c81449c920439da57da7bd5c56a770;m=27cc
        _BOOT_ID=78c81449c920439da57da7bd5c56a770
        PRIORITY=5
        SYSLOG_FACILITY=3
        _TRANSPORT=syslog
        _MACHINE_ID=69d27b356a94476da859461d3a3bc6fd
        _HOSTNAME=localhost.localdomain
        _PID=562
        _COMM=dbus-daemon
        _EXE=/usr/bin/dbus-daemon
        _CMDLINE=/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
        _SYSTEMD_CGROUP=/system/dbus.service
        _SYSTEMD_UNIT=dbus.service
        SYSLOG_IDENTIFIER=dbus
        SYSLOG_PID=562
        _UID=81
        _GID=81
        _SELINUX_CONTEXT=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023
        MESSAGE=[system] Successfully activated service 'net.reactivated.Fprint'
        _SOURCE_REALTIME_TIMESTAMP=1375447282839181
        
[...]
Cet exemple répertorie des champs qui identifient une entrée de journal unique. Ces métadonnées peuvent être utilisées pour le filtrage de messages, comme indiqué dans la section intitulée « Filtrage avancé ». Pour une description complète de tous les champs possibles, veuillez consulter la page man de systemd.journal-fields(7).

20.10.2. Contrôle des accès

Par défaut, les utilisateurs de Journal sans privilèges root peuvent uniquement voir les fichiers journaux qu'ils ont générés. L'administrateur systèmes peut ajouter les utilisateurs sélectionnés au groupe adm, qui leur offre accès aux fichiers journaux complets. Pour effectuer ceci, veuillez saisir en tant qu'utilisateur root :
usermod -a -G adm username
Remplacez username par un nom d'utilisateur à ajouter au groupe adm. Cet utilisateur reçoit ensuite la même sortie de la commande journalctl que l'utilisateur root. Remarquez que le contrôle des accès fonctionne uniquement lorsque le stockage persistant est activé pour Journal.

20.10.3. Utiliser l'affichage Live

Lorsqu'appelé sans paramètres, journalctl affiche la liste complète des entrées, en commençant par l'entrée collectée la plus ancienne. Avec l'affichage Live, vous pouvez superviser les messages journaux en temps réel pendant l'impression continuelle des nouvelles entrées au fur et à mesure qu'elles apparaissent. Pour lancer journalctl en mode d'affichage Live, veuillez saisir :
journalctl -f
Cette commande retourne une liste des dix lignes de journal les plus actuelles. L'utilitaire journalctl continue ensuite de s'exécuter et attend que de nouveaux changements se produisent pour les afficher immédiatement.

20.10.4. Filtrer les messages

La sortie de la commande journalctl exécutée sans paramètre est souvent extensive. Ainsi, vous pouvez utiliser différentes méthodes de filtrage pour extraire des informations qui correspondent à vos besoins.

Filtrer par priorité

Les messages journaux sont souvent utilisés pour suivre des comportements erronés sur le système. Pour afficher les entrées avec une priorité sélectionnée ou plus élevée, veuillez utiliser la syntaxe suivante :
journalctl -p priority
Remplacez priority par l'un des mots-clés suivants (ou par un chiffre) : debug (7), info (6), notice (5), warning (4), err (3), crit (2), alert (1), et emerg (0).

Exemple 20.20. Filtrer par priorité

Pour uniquement afficher les entrées avec une erreur ou une priorité plus élevée, veuillez utiliser :
journalctl -p err

Filtrer par heure

Pour uniquement afficher les entrées de journal du démarrage actuel, veuillez saisir :
journalctl -b
Si vous redémarrez votre système uniquement de manière occasionnelle, l'option -b ne réduira pas significativement la sortie de journalctl. Dans de tels cas, le filtrage basé heure sera plus utile :
journalctl --since=value --until=value
Avec --since et --until, vous pouvez uniquement afficher les messages journaux créés dans un intervalle spécifié. Vous pouvez attribuer des valeurs à ces options sous la forme de date ou d'heure, ou les deux, comme indiqué dans l'exemple ci-dessous.

Exemple 20.21. Filtrer par heure et par priorité

Les options de filtrage peuvent être combinées pour réduire l'ensemble des résultats selon les requêtes spécifiques. Par exemple, pour afficher les messages d'avertissement ou avec une priorité plus élevée à partir d'un certain moment, veuillez saisir :
journalctl -p warning --since="2013-3-16 23:59:59"

Filtrage avancé

Exemple 20.19, « Sortie détaillée de journalctl » répertorie un ensemble de champs qui spécifient une entrée de journal et peuvent tous être utilisés pour le filtrage. Pour une description complète des métadonnées pouvant être stockées par systemd, veuillez consulter la page man de systemd.journal-fields(7). Ces métadonnées sont collectées pour chaque message journal, sans intervention de la part de l'utilisateur. Les valeurs sont habituellement basées texte, mais elles peuvent également prendre des valeurs de binaire et de grande taille. Les champs peuvent se voir assigner des multiples valeurs, même si cela n'est pas très commun.
Pour afficher une liste de valeurs uniques se produisant dans un champ spécifique, veuillez utiliser la syntaxe suivante :
journalctl -F fieldname
Remplacez fieldname par le nom du champ qui vous intéresse.
Pour uniquement afficher les entrées de journal correspondant à une condition particulière, veuillez utiliser la syntaxe suivante :
journalctl fieldname=value
Remplacez fieldname par un nom de champ et value par une valeur spécifique contenue dans ce champ. Par conséquent, seules les lignes correspondantes à cette condition seront retournées.

Note

Comme le nombre de champs de métadonnées stockés par systemd est assez important, il est facile d'oublier le nom exact du champ d'intérêt. En cas d'incertitude, veuillez saisir :
journalctl
et appuyez sur la touche Tab deux fois. Cela affichera une liste de noms de champs disponibles. La complétion Tab basée sur le contexte fonctionne sur les noms de champ, et vous pouvez ainsi saisir un ensemble distinctif de lettres d'un nom de champ et appuyer sur Tab pour compléter le nom automatiquement. Similairement, vous pouvez répertorier des valeurs uniques à partir d'un champ. Saisissez :
journalctl fieldname=
et appuyez sur la touche Tab deux fois. Ceci sert d'alternative à journalctl -F fieldname.
Vous pouvez spécifier de multiples valeurs pour un champ :
journalctl fieldname=value1 fieldname=value2 ...
Spécifier deux correspondances pour le même champ résulte en une combinaison OR des deux correspondances. Les entrées qui correspondent à value1 ou value2 sont affichées.
Aussi, vous pouvez spécifier de multiples paires champ/valeur pour réduire encore plus l'ensemble de la sortie :
journalctl fieldname1=value fieldname2=value ...
Si deux correspondances pour différents noms de champs sont spécifiées, elles seront combinées avec un AND logique. Les entrées doivent correspondre aux deux conditions pour être affichées.
Avec l'utilisation du symbole +, vous pouvez définir une combinaison OR logique des correspondances pour plusieurs champs :
journalctl fieldname1=value + fieldname2=value ...
Cette commande retourne des entrées qui correspondent à au moins une des conditions, et non seulement celles qui correspondent aux deux.

Exemple 20.22. Filtrage avancé

Pour afficher les entrées créées par avahi-daemon.service ou crond.service sous un utilisateur avec l'UID 70, veuillez utiliser la commande suivante :
journalctl _UID=70 _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=crond.service
Comme il existe deux ensembles de valeurs pour le champ _SYSTEMD_UNIT, les deux résultats seront affichés, mais uniquement lorsqu'ils correspondent à la condition _UID=70. Ceci peut être exprimé simplement comme suit : (UID=70 and (avahi or cron)).
Vous pouvez également appliquer le filtrage susmentionné dans le mode d'affichage Live pour suivre les derniers changements dans le groupe sélectionné d'entrées de journal :
journalctl -f fieldname=value ...

20.10.5. Activer le stockage persistant

Par défaut, Journal stocke uniquement les fichiers journaux dans la mémoire ou dans une mémoire tampon en anneau dans le répertoire /run/log/journal/. Cela est suffisant pour afficher l'historique récent des journaux avec journalctl. Ce répertoire est volatile, les données de journal ne sont pas enregistrées de manière permanente. Avec la configuration par défaut, syslog lit les enregistrements de journal et les stocke dans le répertoire /var/log/. Avec la journalisation persistante activée, les fichiers journaux sont stockés dans /var/log/journal, ce qui signifie qu'ils persisteront après un redémarrage. Journal peut ensuite remplacer rsyslog pour certains utilisateurs (veuillez consulter l'introduction du chapitre).
Un stockage persistant activé offre les avantages suivant
  • Des données enrichies sont enregistrées pour la résolution de problèmes pendant une longue période
  • Pour une résolution de problème immédiate, des données enrichies seront disponibles après un redémarrage
  • Actuellement, la console du serveur lit les données à partir du journal, et non à partir des fichiers journaux
Le stockage persistant présente également certains inconvénients :
  • Même avec un stockage persistant, la quantité de données stockée dépend de la mémoire disponible, il n'y a pas de garantie de couverture d'une période spécifique
  • Davantage d'espace disque est nécessaire pour les journaux
Pour activer le stockage persistant pour Journal, créez le répertoire journal manuellement comme indiqué dans l'exemple suivant. En tant qu'utilisateur root, veuillez saisir :
mkdir -p /var/log/journal/
Puis redémarrez journald pour appliquer le changement :
systemctl restart systemd-journald