systemd

Master journalctl comprendre les journaux systemd

Master journalctl comprendre les journaux systemd
Systemd est le nouvel outil de gestion des services. Créé initialement par Red Hat, il permet de mieux gérer les services via un processus centralisé qui surveille et lance les services selon les besoins. Mais systemd comprend également un système de conteneur, un système cron, un moyen de fournir des répertoires temporaires aux services de manière sécurisée et également un système de journalisation - c'est là que nous allons nous concentrer ici.

Comprendre les logs est important : si jamais vous tombez sur un serveur qui a un bug ou est piraté, généralement votre seul moyen de comprendre ce qui s'est passé est via les logs. L'application principale que nous allons utiliser est journalctl d'où le nom de l'article. Alors écoutez bien comme au bon jour, vous serez peut-être heureux de savoir comment ça marche.

Où sont stockés les journaux systemd? Et dans quel format il est stocké?

Nous supposerons que vous avez un système normal, car systemd peut être personnalisé pour être dans des endroits exceptionnels. De plus, certaines distributions Linux comme Ubuntu 16.04 désactivé la journalisation persistante par défaut, ce qui empêche systemd de faire son travail correctement. Si vous avez une telle distribution, éditez /etc/systemd/journald.conf, remplacez Storage=auto par Storage=persistent et enfin, redémarrez.

Vous trouverez donc normalement les fichiers de logs systemd dans /var/log/journal. Le système de journalisation est lui-même un service appelé system-journald.un service.  Essayons de lister les fichiers dans ce répertoire :

# ls /var/log/journal/ -R
/var/log/journal/ :
15e43c1734090ac7fbea6b40fcd99d31
 
/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31 :
systè[email protected]~
système@62ac1299826d036cb043d6c06a9493b7-000000000000001-00067d6410099a19.journal
[email protected]~
utilisateur-1000@2123bc076b58569fe1fb13e9dbc1b0e0-0000000000000001-0007fe36ac2810e0.journal
utilisateur-1000.journal
[beaucoup d'autres fichiers comme ceux ci-dessus… ]

Parce que je veux que vous continuiez à lire, j'ai dû raccourcir la sortie car elle contient de nombreux fichiers (dans mon exemple, plus de 60 fichiers), désolé pour ça! Tenté d'en ouvrir un peut-être?

# head --bytes=512 /var/log/journal/15e43c1734090ac7fbea6b40fcd99d31/[email protected]
b58569fe1fb13e9dbc1b0e0-000000000000001-0007fe36ac2810e0.journal
?s,q?n/FLz???Ulz?je?]????
?_?b???z????o?y1KN ?je?eO??W?vous?  ?=?x0?L?ré?7??X4n#?e? d3l?
p??o|MFO :?!qs?.tK??R?\??1?|5  ????$?g??#?S??;??B7???????t???Oui????mN?q????ZQ
?Yv?e?????BD?C?? wF??d|
?2?? 7???????[??ONU?=8????c?2=p?&?"   ?0
????*????_??  ???
5?????oui?g? ?6?|??vous??w : #12?Oui??
3      TU ;???'?jX??2?X'?=??[[email protégé]
[email protégé]?_?>??3S???,g / D?.?$?g?L???s?/E??M1??q???

Hé, tu vois, ça ne ressemble pas vraiment aux fichiers journaux habituels que tu vois correctement? Ne vous inquiétez pas, ce fichier n'est pas corrompu, vous venez de découvrir un aspect de systemd : systemd stocke les fichiers dans un format binaire. C'est pourquoi il est aussi petit que possible : les données structurées telles que l'heure ou l'emplacement sont stockées directement en binaire, ce qui prend généralement moins d'octets que le texte. Mais ce n'est pas la seule raison.

systemd ne stocke pas seulement les lignes de journal. Son objectif est de faciliter la surveillance et l'exploration des journaux. Pour aider dans cette tâche, les messages de journal sont en fait une ligne de texte accompagnée de données telles que la gravité du journal (avertissement, erreur, etc.), voire des champs qui ne seraient utiles qu'à votre application (URL demandée par exemple).

# journalctl --output=verbose --all
PRIORITÉ=6
_UID=0
_GID=0
_CAP_EFFECTIVE=3ffffffffff
_BOOT_ID=ee4cc2ce7e8273aaffb5fc59c873ce7b
_MACHINE_ID=bc422e0feaab64bb7dd218c24e6830e5
_HOSTNAME=linux
SYSLOG_FACILITY=3
SYSLOG_IDENTIFIER=systemd
UNITÉ=dnf-makecache.un service
_TRANSPORT=journal
_PID=1
_COMM=systemd
_EXE=/usr/lib/systemd/systemd
_CMDLINE=/usr/lib/systemd/systemd --switched-root --system --deserialize 76
_SYSTEMD_CGROUP=/init.portée
_SYSTEMD_UNIT=init.portée
_SYSTEMD_SLICE=-.tranche
_SELINUX_CONTEXT=system_u:system_r:init_t:s0
CODE_FILE=src/core/job.c
CODE_LINE=795
CODE_FUNCTION=journal_travail_status_message
MESSAGE_ID=a76e08846f5f0971371dbb11126e62e1
MESSAGE=Démarrage du makecache dnf.
# journalctl --catalog --lines=3000 --pager-end "_TRANSPORT=kernel"    RESULT=done
_SOURCE_REALTIME_TIMESTAMP=1532886335471422

Je vous ai dit qu'il y avait beaucoup de champs (ici il y a 25 champs, ou 29 horodatages de comptage), tout l'extrait ci-dessus ne concerne qu'un seul message de journal! Le gros avantage est que vous pouvez lancer une recherche en filtrant sur n'importe quel champ de ce message de journal. Cela vous permet vraiment un filtrage avancé.

L'un des filtres les plus évidents que vous voudriez est de filtrer par le service. Comme vous pouvez le voir ci-dessus, il y a un champ UNIT afin que vous puissiez facilement filtrer pour n'obtenir que les messages de journal d'un service. je vous en dirai plus plus tard.

Mais cette quantité de données signifie aussi autre chose : dans presque tous les cas, vous n'ouvrirez jamais un fichier journal manuellement et vous ne toucherez jamais au dossier /var/log/journal. Vous utiliserez journalctl pour toute tâche liée à la journalisation. Il n'y a pas de telle rotation de journal, tout est géré par l'heure du message de journal.

De plus, le nombre de champs dépendra de la qualité de l'intégration de systemd dans votre application. Plus un message de journal contient de champs, mieux c'est. Pour les services du système de base, systemd s'est déjà occupé de faire une bonne intégration mais pour les autres applications et services, la qualité de l'intégration varie beaucoup. Normalement, cela devrait s'améliorer avec le temps à mesure que les gens s'habituent à systemd.

Bon, maintenant il est temps de découvrir les fonctionnalités de journalctl.

Commandes les plus utilisées pour journalctl

La première commande que vous voudrez peut-être consulter est celle qui affiche les journaux du noyau Linux. Oui, systemd gère également le stockage des journaux du noyau, vous pouvez donc également obtenir les journaux des démarrages précédents. Voici la commande :

# journalctl --catalog --lines=3000 --pager-end "_TRANSPORT=kernel"

Il vous montre un pager où vous pouvez voir les derniers messages. Vous pouvez faire défiler jusqu'aux 3 000 dernières lignes à l'aide des touches fléchées (↑ / ↓) ou Page Up / Page Down. L'indicateur -catalog demande à journalctl d'afficher le contexte autour des lignes de journal, un peu comme les redémarrages de l'ordinateur ou, dans d'autres contextes, un service s'arrêtant/démarrant. Je mets toujours ce drapeau car le contexte compte toujours, il est utile de savoir dans quelle situation la ligne de journal est apparue, afin que vous puissiez deviner pourquoi vous avez obtenu cette ligne de journal.

Maintenant, vous voulez peut-être voir uniquement les lignes de journal du démarrage actuel :

# journalctl --catalog --lines=35000 --pager-end --boot "_TRANSPORT=kernel"

Notez que l'argument de ligne de commande -boot fonctionne dans toutes les situations, pas seulement avec les journaux du noyau. Si vous préférez commencer par le début :

# journalctl --catalog --boot "_TRANSPORT=kernel"

Je ne sais pas si c'est le cas pour toi, mais j'en ai assez des logs du noyau! Et si vous aviez une vue d'ensemble de votre machine?

# journalctl --catalog --lines=3000 --pager-end

Wow, il se passe beaucoup de choses sur votre système! Un peu de filtrage serait utile ici. L'un des filtres les plus utilisés correspond à un service spécifique (comme votre serveur SSH ou votre serveur HTTP), le nom de fichier de l'unité systemd pour le service SSH est sshd.service, donc :

# journalctl --catalog --lines=3000 --pager-end --unit=sshd.un service

C'est cool, n'est-ce pas? Eh bien, ce n'est utilisable que si vous connaissez le nom du service - mais dans de nombreux cas, vous ne connaissez pas le nom de ce service. Si vous êtes dans une telle situation, vous voudrez peut-être une liste des services, leurs descriptions et leur statut :

# systemctl list-units --type=service

Bon, ce problème est maintenant résolu. Mais parfois, vous avez un message d'erreur que vous recevez d'un système externe comme votre propre site Web ou d'une application sur votre bureau. Vous voudrez donc probablement rechercher un mot ou une phrase spécifique dans le message du journal. Depuis systemd v237, c'est maintenant possible.

Dans journalctl, la recherche est insensible à la casse si le mot que vous recherchez est tout en minuscules. Donc, si vous recherchez le mot port, il recherchera également le mot port avec des lettres majuscules. Un exemple:

# journalctl --catalog --lines=3000 --pager-end --grep="port"

Maintenant, si vous recherchez un mot comme CPU, il ne recherchera que CPU avec toutes les lettres majuscules, il ne recherchera pas CPU.

# journalctl --catalog --lines=3000 --pager-end --grep="CPU"

Vous vous souvenez du message d'erreur du système externe? Généralement, ces messages contiennent un horodatage. Pour filtrer le message du journal, vous pouvez utiliser cet horodatage. journalctl peut vous lister tous les messages de journal depuis une date et une heure spécifiques avec l'argument -since :

# journalctl --catalog --since="2018-07-30 09:30:00"

Si ce système externe est distant ou utilise des horodatages UTC, vous souhaiterez filtrer en fonction d'une date et d'une heure UTC et afficher dans le terminal les horodatages UTC afin que vous n'ayez pas besoin de les convertir dans votre tête, cela a tendance à être vraiment déroutant. Pour ce faire, vous devrez ajouter UTC après la chaîne de temps dans l'argument -since. Vous devrez ensuite ajouter le drapeau -utc. Ainsi, par exemple :

# journalctl --catalog --since="2018-07-30 10:45:00 UTC" --utc

Notez que vous pouvez utiliser le drapeau -utc seul, dans ce cas, il affichera essentiellement toutes les dates et heures dans le fuseau horaire UTC.

# journalctl --catalog --lines=3000 --pager-end --utc

Les logs sont mieux gérés avec journalctl

Comme vous pouvez le voir avec toutes les commandes précédentes, la journalisation systemd facilite le filtrage et donc le débogage car vous pouvez sélectionner toutes les lignes de journal à l'aide d'une seule commande, journalctl. Certains d'entre vous connaissaient probablement les temps anciens où vous deviez ouvrir manuellement chaque fichier dans /var/log pour avoir une idée générale du problème et de ce qui s'est passé. Avec tous les conseils que vous avez appris ici, vous disposerez d'outils solides pour consulter vos messages de journal comme VOUS le souhaitez.

Comment télécharger et jouer à Civilization VI de Sid Meier sur Linux
Présentation du jeu Civilization 6 est une version moderne du concept classique introduit dans la série de jeux Age of Empires. L'idée était assez sim...
Comment installer et jouer à Doom sur Linux
Introduction à Doom La série Doom est née dans les années 90 après la sortie du Doom original. Ce fut un succès instantané et à partir de ce moment-là...
Vulkan pour les utilisateurs Linux
Avec chaque nouvelle génération de cartes graphiques, nous voyons les développeurs de jeux repousser les limites de la fidélité graphique et se rappro...