Techniques avancées de dépannage avec systemd journald

Dépanner les journaux systemd avec des filtres temporels, la sélection de démarrage, les requêtes par unité, les niveaux de priorité et les exportations.

Techniques avancées de dépannage avec systemd journald

Le débogage d'un hôte Linux basé sur systemd commence souvent par le journal. journalctl -xe peut afficher les échecs récents, mais un véritable dépannage implique généralement de réduire les journaux par démarrage, plage temporelle, unité, priorité, processus ou exécutable.

Les exemples ci-dessous montrent comment transformer un journal volumineux en une vue ciblée que vous pouvez utiliser lors de pannes de service, de problèmes de démarrage et d'erreurs système récurrentes.

Comprendre le journal : structure et emplacement

Le journal systemd agrège les journaux du noyau, des services système et des applications. Contrairement aux fichiers syslog traditionnels, le journal stocke les journaux dans un format binaire indexé, ce qui permet des requêtes sophistiquées via journalctl. Les journaux sont généralement persistés dans des répertoires comme /var/log/journal/.

Concepts clés à retenir :

  • Journalisation structurée : Les entrées contiennent des champs de métadonnées (comme _PID, _COMM, _SYSTEMD_UNIT) que journalctl utilise pour le filtrage.
  • Volatile vs. Persistant : Les journaux peuvent être stockés uniquement en mémoire (volatile) ou écrits sur le disque (persistant). La configuration par défaut favorise généralement la persistance.

Techniques de filtrage avancées essentielles

La puissance de journalctl réside dans sa capacité à réduire des millions d'entrées de journal. Voici les filtres avancés les plus efficaces.

1. Filtrage basé sur le temps

Les plages temporelles sont essentielles pour diagnostiquer des problèmes transitoires ou des régressions de performance. Vous pouvez spécifier l'heure en utilisant des formats absolus ou des ancres relatives.

A. Temps relatif : Utilisez -S (since) et -U (until) pour des spécifications de temps relatives.

# Afficher les journaux des 30 dernières minutes
journalctl --since "30 minutes ago"

# Afficher les journaux entre 10h00 hier et maintenant
journalctl -S yesterday -U now

# Afficher les journaux d'une plage temporelle spécifique (format ISO 8601)
journalctl --since "2024-05-01 08:00:00" --until "2024-05-01 08:15:00"

B. Temps basé sur le démarrage : Pour analyser une séquence de démarrage problématique spécifique, utilisez le drapeau -b.

# Afficher uniquement les journaux du démarrage actuel
journalctl -b

# Afficher les journaux du démarrage précédent
journalctl -b -1

# Afficher les journaux du noyau de l'avant-dernier démarrage
journalctl -b -2 -k

2. Filtrage par unité systemd et service

Pour isoler les journaux appartenant à un service spécifique, utilisez le drapeau -u ou --unit. C'est indispensable lors du dépannage de services défaillants.

# Afficher tous les journaux du service du serveur web Apache
journalctl -u httpd.service

# Afficher les journaux du service depuis son dernier démarrage
journalctl -u nginx.service --since "start of job -1"

3. Filtrage par ID de processus (PID) et nom d'exécutable

Lorsqu'un processus spécifique plante, mais que vous ne savez pas immédiatement à quel service il appartient, le filtrage par PID ou par nom d'exécutable (_COMM) est très efficace.

# Afficher les journaux liés à un ID de processus spécifique (par exemple, PID 4589)
journalctl _PID=4589

# Afficher les journaux pour tous les processus nommés 'mysqld'
journalctl _COMM=mysqld

4. Filtrage par niveau de priorité

Les entrées du journal se voient attribuer des priorités numériques (0=emerg, 7=debug). Utilisez le drapeau -p pour filtrer par sévérité, ce qui aide à supprimer les sorties de débogage excessives lors de la recherche d'erreurs.

Niveau de priorité Mot-clé Valeur numérique
Urgence emerg 0
Alerte alert 1
Critique crit 2
Erreur err 3
Avertissement warning 4
Avis notice 5
Info info 6
Débogage debug 7
# Afficher uniquement les erreurs critiques (niveau 2) et supérieures pour le système
journalctl -p crit

# Afficher tous les journaux sauf les messages de débogage
journalctl -p 6

Analyse des échecs de démarrage et des messages du noyau

Le dépannage des problèmes de démarrage système nécessite de séparer les défaillances des services en espace utilisateur des problèmes d'initialisation du noyau ou du matériel.

Isolation des messages du noyau (-k ou --dmesg)

Le drapeau -k affiche uniquement les messages du noyau (équivalent à l'exécution de dmesg). Ceci est crucial pour identifier les problèmes liés aux pilotes de périphériques, à la reconnaissance matérielle ou aux échecs d'initialisation précoces avant même que systemd ne charge les services.

# Examiner tous les messages du noyau du démarrage actuel
journalctl -k

# Rechercher des erreurs matérielles spécifiques dans le journal du noyau du démarrage précédent
journalctl -k -b -1 | grep -i "error"

Traçage des dépendances de service

Lorsqu'un service ne parvient pas à démarrer, cela peut être dû à une dépendance en amont qui échoue. Utilisez l'affichage inversé (-r) combiné au filtrage par unité pour voir la séquence menant à l'échec.

# Afficher les journaux d'une unité dans l'ordre chronologique inverse
journalctl -u my-app.service -r

Formatage avancé de la sortie et exportation

Pour une analyse plus approfondie ou le partage de journaux, la modification du format de sortie est essentielle.

1. Affichage au format JSON (-o json)

Pour les scripts ou l'intégration avec des outils d'analyse de journaux externes, la sortie JSON structurée est préférée.

journalctl -u sshd.service -o json

2. Affichage sur une seule ligne (-o cat)

Pour obtenir une sortie propre et brute sans horodatage ni métadonnées (utile lors du pipage direct vers d'autres outils comme grep), utilisez le format cat.

journalctl -u cron.service -o cat

3. Exportation des journaux

Pour archiver ou transférer des journaux, exportez-les vers un fichier texte standard. Si vous avez besoin de champs de métadonnées spécifiques, choisissez un format de sortie qui inclut des champs structurés.

# Exporter tous les journaux du démarrage actuel vers un fichier texte
journalctl -b > boot_log_$(date +%F).txt

# Exporter les champs structurés sélectionnés pour une unité
journalctl -u mariadb.service -o json --output-fields=__REALTIME_TIMESTAMP,PRIORITY,_PID,_COMM,MESSAGE --since today > mariadb_recent.json

Meilleures pratiques pour la gestion du journal

La gestion de la taille du journal est cruciale pour éviter l'épuisement de l'espace disque, en particulier sur les systèmes avec un volume de journaux élevé.

  • Vérifier l'utilisation : Déterminez la consommation actuelle du disque du journal :
    journalctl --disk-usage
    
  • Nettoyer les anciens journaux : Limitez la taille du journal par le temps ou l'utilisation du disque à l'aide des commandes vacuum :
    # Conserver uniquement les journaux des 7 derniers jours
    sudo journalctl --vacuum-time=7d
    
    # Réduire l'utilisation du disque à un maximum de 500 Mo
    sudo journalctl --vacuum-size=500M
    

Utilisez les filtres du journal comme un outil de réduction : choisissez d'abord le démarrage, la fenêtre temporelle, l'unité et la priorité, puis modifiez le format de sortie uniquement lorsque vous devez archiver ou analyser le résultat.