Maître journalctl comprend les journaux systemd

Maître journalctl comprend 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 au besoin. Mais SystemD comprend également un système de conteneurs, un système Cron, un moyen de fournir des répertoires temporaires aux services de manière sécurisée et aussi un système de journalisation - c'est là que nous allons nous concentrer ici.

Comprendre les journaux est important: si vous tombez sur un serveur qui a un bug ou est piraté, généralement votre seule façon de comprendre ce qui s'est passé est via les journaux. La principale application que nous allons utiliser est Journalctl d'où le nom de l'article. Alors écoutez attentivement le bon jour, vous serez peut-être heureux de savoir comment cela fonctionne.

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

Nous supposerons l'hypothèse 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 La journalisation persistante handicapée par défaut, qui empêche le systemd de faire son travail correctement. Si vous avez une telle distribution, modifiez / etc / systemd / journald.Fichier Conf, modifier le stockage = auto en stockage = persistance et enfin, redémarrer.

Vous trouverez donc normalement les fichiers SystemD Logs dans / var / log / journal. Le système de journalisation est lui-même un service appelé System-Journald.service. Essayons de répertorier les fichiers dans ce répertoire:

# ls / var / log / journal / -r
/ var / log / journal /:
15E43C1734090AC7FBEA6B40FCD99D31
/ var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31:
Système @ A39DA368947BD2BA-231F9BFC18A7A356.journal ~
Système @ 62AC1299826D036CB043D6C06A9493B7-00000000000001-00067D6410099A19.journal
user-1000 @ b27e98812223a9bc-387e0521703f73d9.journal ~
User-1000 @ 2123BC076B58569FE1FB13E9DBC1B0E0-00000000000001-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 il contient de nombreux fichiers (dans mon exemple, plus de 60 fichiers), désolé! Tenté d'en ouvrir un peut-être?

# head --bytes = 512 / var / log / journal / 15e43c1734090ac7fbea6b40fcd99d31 / user-1000 @ 2123bc076
B58569FE1FB13E9DBC1B0E0-0000000000000001-0007FE36AC2810E0.journal
?S, Q?n / flz???Ulz?l?]]????
?_?b???z????o?y1kn ?je?eo??W?u? ?=?x0?L?d?7??X4n #?e? D3L?
p??O | MFO:?!QS?.tk??R?\??1?| 5 ????$?g??#?S??;??B7???????t???Y????MN?q????Zq
?Yv?e?????Bd?C?? wf??D |
?2?? 7???????[??ONU?= 8????c?2 = P?&?" ?0
????*????_?? ???
5?????yk?g? ?6?|??u??W: # 12?Y??
3 TU;???'?jx??2?X'?=??[Q???@Z
T_???3EHMD?@?_?>??3s???,g / D?.?$?g?L???s?/ E??M1??q???

Hé, voyez, cela ne ressemble pas vraiment aux fichiers journaux habituels que vous voyez bien? Ne vous inquiétez pas, ce fichier n'est pas corrompu, vous venez de découvrir un aspect de SystemD: SystemD stocke des fichiers dans un format binaire. C'est pourquoi il est aussi petit que possible: des données structurées telles que le temps 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 stockait pas seulement les lignes de journal. Son intention est de faciliter la surveillance et l'exploration des journaux. Pour aider dans cette tâche, les messages journaux sont en fait une ligne de texte accompagnée de données telles que la gravité du journal (avertissement, erreur, etc.), ou même des champs qui ne seraient utiles qu'à votre application (URL demandée par exemple).

# journalctl --output = verbose - tout
Priorité = 6
_Uid = 0
_Gid = 0
_Cap_effective = 3fffffffff
_Boot_id = ee4cc2ce7e8273aaffb5fc59c873ce7b
_MACHINE_ID = BC422E0FEAAB64BB7DD218C24E6830E5
_Hostname = Linux
Syslog_factility = 3
Syslog_identifier = systemd
Unité = dnf-makecache.service
_Transport = Journal
_Pid = 1
_Comm = systemd
_Exe = / usr / lib / systemd / systemd
_Cmdline = / usr / lib / systemd / systemd --switched-root --System --désérialize 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 = job_log_status_message
Message_id = a76e08846f5f0971371dbb11126e62e1
Message = démarré dnf makecache.
# JournalCTL - Catalog --Les = 3000 --Pager-End "_Transport = Kernel" Result = Terminé
_Source_realtime_timestamp = 1532886335471422

Je vous ai dit qu'il y avait beaucoup de champs (ici, il y a 25 champs, ou 29 horodatages), tout l'extrait ci-dessus est uniquement pour un seul message de journal! Le grand avantage est que vous pouvez effectuer une recherche en filtrant sur n'importe quel champ de ce message de journal. Cela vous permet vraiment de filtrer 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 d'unité afin que vous puissiez facilement filtrer pour obtenir uniquement des messages de journal à partir d'un seul service. Je vais vous en dire plus à ce sujet plus tard.

Mais cette quantité de données signifie également autre chose: dans presque tous les cas, vous n'aurez jamais ouvrir 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 temps de message de journal.

De plus, le nombre de champs dépendra de la qualité de l'intégration de Systemd dans votre application. Plus il y a de champs, un message journal contient, 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 d'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.

D'accord, il est maintenant temps de découvrir les fonctionnalités de Journalctl.

Commandes les plus utilisées pour JournalCTL

La première commande sur laquelle vous voudrez peut-être jeter un œil est celle qui montre les journaux du noyau Linux. Oui, Systemd gère également le stockage des journaux du noyau, afin que vous puissiez également obtenir les journaux des bottes précédentes. Voici la commande:

# JournalCTL - catalog --Les = 3000 --Pager-End "_Transport = Kernel"

Il vous montre un téléavertisseur où vous pouvez voir les derniers messages. Vous pouvez faire défiler jusqu'aux 3 000 dernières lignes à l'aide de touches fléchées (↑ / ↓) ou de page / page vers le bas. Le Flag -Catalog Demande à Journalctl d'afficher le contexte autour des lignes de journal, un peu comme les redémarrages d'ordinateurs ou, dans d'autres contextes, un service arrêtant / démarrage. 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 cette ligne de journal.

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

# JournalCTL - catalog --Les = 35000 --Pager-End --boot "_Transport = Kernel"

Remarque L'argument de la ligne de commande -boot fonctionne dans toutes les situations, pas seulement avec les journaux de Kernel. Si vous préférez commencer depuis le début:

# JournalCTL --catalog --boot "_transport = kernel"

Je ne sais pas si c'est le cas pour toi, mais j'ai assez de journaux de noyau! Et qu'en est-il d'avoir un aperçu général de votre machine?

# JournalCTL - Catalog --Les = 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 --Les = 3000 --Pager-End --Unit = SSHD.service

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

# SystemCTL List-Units --Type = Service

D'accord, 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 à partir 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 au cas si le mot que vous recherchez est en minuscules. Donc, si vous recherchez le port de mots, il recherchera également le port de mots avec des lettres capitalisées. Un exemple:

# JournalCTL - catalog --Les = 3000 --Pager-End --grep = "Port"

Maintenant, si vous recherchez un mot comme CPU, il ne recherchera que le processeur avec toutes les lettres capitalisées, elle ne recherchera pas le processeur.

# JournalCTL --catalog --Les = 3000 --Pager-End --grep = "CPU"

Vous vous souvenez du message d'erreur du système externe? Généralement, ces messages contient un horodatage. Pour filtrer le message du journal, vous voudrez peut-être utiliser cet horodatage. JournalCTL peut vous répertorier tous les messages de journal depuis une date et une heure spécifiques avec l'argument -ince:

# JournalCTL - catalog --sece = "2018-07-30 09:30:00"

Si ce système externe est distant ou utilise des horodatages UTC, vous voudrez 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 le convertir dans votre tête, cela a tendance à être Vraiment déroutant. Pour ce faire, vous devrez ajouter de l'UTC après la chaîne de temps dans le fait de l'argument. Vous devrez alors ajouter le drapeau -UTC. Ainsi, par exemple:

# JournalCTL - catalog --Since = "2018-07-30 10:45:00 UTC" --UTC

Remarque 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 --Les = 3000 - Pager-End --Utc

Les journaux sont mieux gérés avec journalctl

Comme vous pouvez le voir avec toutes les commandes précédentes, SystemD Journaling facilite le filtrage et le débogage que vous pouvez sélectionner via 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 possédez des outils solides pour consulter vos messages de journal comme vous le souhaitez.