Maîtriser Systemd et Journalctl pour surveiller Linux

🏷️ Administration Serveur 📅 18/03/2026 11:00:00 👤 Mezgani Said
Systemd Journalctl Linux Monitoring Logs
Maîtriser Systemd et Journalctl pour surveiller Linux

Gestion complète des services avec systemd, maîtrise de journalctl, création d'unités personnalisées, rotation des logs et monitoring en production.

Introduction à Systemd

Systemd est le gestionnaire de services et de système standard sur les distributions Linux modernes (Ubuntu 18+, Debian 8+, CentOS 7+, etc.). Il a remplacé les anciens scripts SysVinit et Upstart, offrant une meilleure gestion des dépendances entre services, un démarrage plus rapide et une architecture orientée unités.

Les logs système sont centralisés via journald, l'outil de journalisation natif de systemd, accessible via la commande journalctl.

À retenir : Systemd gère non seulement les services, mais aussi les logs système, les montages, les interfaces réseau et plus encore. Journalctl permet une recherche puissante dans ces logs.

Gérer les services avec systemctl

La commande systemctl est l'interface principale pour gérer les services systemd. Voici les opérations essentielles :

# Démarrer un service
sudo systemctl start nginx

# Arrêter un service
sudo systemctl stop nginx

# Redémarrer un service
sudo systemctl restart nginx

# Recharger la configuration (sans interruption)
sudo systemctl reload nginx

# Vérifier le statut d'un service
sudo systemctl status nginx

# Activer un service au démarrage
sudo systemctl enable nginx

# Désactiver un service au démarrage
sudo systemctl disable nginx

# Lister tous les services actifs
sudo systemctl list-units --type=service --state=running

# Voir les services qui ont échoué
sudo systemctl list-units --type=service --state=failed

Le fichier de service est généralement situé dans /etc/systemd/system/ ou /usr/lib/systemd/system/ pour les services système.

Note : Utilisez systemctl restart pour redémarrer complètement, ou systemctl reload si le service supporte la rechargement sans interruption (plus fluide pour les serveurs web).

Journalctl : maîtriser les logs système

Journalctl permet de consulter les logs stockés dans la journalisation binaire de systemd. Contrairement aux logs texte traditionnels dans /var/log/, journalctl offre un accès structuré et recherche avancée.

# Voir les derniers logs (comme 'tail -f')
sudo journalctl -f

# Voir les 100 dernières lignes
sudo journalctl -n 100

# Filtrer par unité (service)
sudo journalctl -u nginx

# Voir les logs du service avec suivi en temps réel
sudo journalctl -u nginx -f

# Filtrer par priorité (emerg, alert, crit, err, warning, notice, info, debug)
sudo journalctl -p err

# Voir les logs des 24 dernières heures
sudo journalctl --since "24 hours ago"

# Voir les logs entre deux dates
sudo journalctl --since "2026-04-20" --until "2026-04-24"

# Filtrer par processus ID
sudo journalctl _PID=1234

# Voir les logs avec sortie formatée JSON
sudo journalctl -u nginx -o json

# Combiner plusieurs filtres
sudo journalctl -u nginx -p err --since "1 hour ago"
À retenir : Utilisez -f pour suivre les logs en temps réel (comme tail -f), -u pour filtrer par service, et -p pour filtrer par niveau de sévérité.

Créer des unités systemd personnalisées

Vous pouvez créer vos propres services systemd pour automatiser le démarrage d'applications. Voici un exemple complet pour une application Node.js :

# Créer le fichier de service
sudo nano /etc/systemd/system/myapp.service

Contenu du fichier :

[Unit]
Description=Mon application Node.js
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=nodeuser
WorkingDirectory=/home/nodeuser/myapp
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

# Limiter les ressources
LimitNOFILE=65535
MemoryMax=512M

[Install]
WantedBy=multi-user.target

Puis activer et démarrer le service :

# Recharger systemd
sudo systemctl daemon-reload

# Activer au démarrage
sudo systemctl enable myapp

# Démarrer le service
sudo systemctl start myapp

# Vérifier le statut
sudo systemctl status myapp

# Voir les logs
sudo journalctl -u myapp -f
Note : Les champs StandardOutput=journal et StandardError=journal redirigent les logs vers journalctl au lieu de créer des fichiers séparés.

Rotation des logs et gestion d'espace

Journalctl stocke les logs dans /var/log/journal/. Pour éviter que les logs ne consomment tout l'espace disque, configurez la rétention :

# Voir la taille actuelle des logs
sudo journalctl --disk-usage

# Voir la limite de stockage
sudo journalctl --vacuum-size=1G

# Supprimer les logs de plus de 30 jours
sudo journalctl --vacuum-time=30d

# Configurer les limites de façon permanente
sudo nano /etc/systemd/journald.conf

Dans /etc/systemd/journald.conf, ajoutez :

# Limite la taille du journal à 1GB
SystemMaxUse=1G

# Conserve les logs pendant 30 jours
MaxRetentionSec=30day

# Taille max par fichier journal
SystemMaxFileSize=100M

Puis redémarrez le service :

sudo systemctl restart systemd-journald

Alertes et monitoring des logs

Pour monitorer les logs en production et déclencher des alertes, utilisez des outils comme Prometheus avec l'exporteur systemd_exporter, ou créez des scripts automatisés.

Exemple 1 : Script bash pour alerter sur erreurs :

#!/bin/bash
# Script de monitoring des erreurs nginx

ALERT_EMAIL="admin@example.com"

# Chercher les erreurs des 5 dernières minutes
ERRORS=$(journalctl -u nginx -p err --since "5 minutes ago")

if [ ! -z "$ERRORS" ]; then
    echo "Erreurs détectées dans Nginx:" | mail -s "Alerte Nginx" "$ALERT_EMAIL"
    echo "$ERRORS" | mail -s "Alerte Nginx" "$ALERT_EMAIL"
fi

Planifiez ce script avec cron :

# Exécuter toutes les 5 minutes
*/5 * * * * /usr/local/bin/monitor-nginx-errors.sh

Exemple 2 : Intégration Prometheus (basique) :

# Installer systemd_exporter
sudo apt install -y prometheus-systemd-exporter

# Activer le service
sudo systemctl enable prometheus-systemd-exporter
sudo systemctl start prometheus-systemd-exporter

# Accessible sur http://localhost:9558/metrics
À retenir : Pour la production, utilisez des outils de monitoring centralisés (Prometheus, Grafana, ELK stack) plutôt que des scripts simples.

Debugging avec les logs système

Quand une application crash ou ne démarre pas, les logs sont votre meilleur ami. Voici comment investiguer :

# 1. Vérifier le statut du service
sudo systemctl status myapp

# 2. Voir les logs détaillés avec contexte
sudo journalctl -u myapp -n 50 -o short-precise

# 3. Voir ALL les logs (pas seulement depuis le boot)
sudo journalctl -u myapp --all

# 4. Rechercher des erreurs spécifiques
sudo journalctl -u myapp | grep "ERROR\|Failed\|error"

# 5. Exporter les logs pour analyse offline
sudo journalctl -u myapp -o json > logs_export.json

# 6. Voir les limites de ressources
sudo systemctl show myapp | grep Limit

Cas courant : service redémarre en boucle

Vérifiez les logs pour la cause :

sudo journalctl -u myapp -f

# Puis essayez de démarrer manuellement pour voir l'erreur
sudo -u myapp /usr/bin/node /path/to/app/server.js
Conseil : Activez la sortie JSON (-o json) pour parser les logs de façon programmatique dans vos scripts de monitoring.

Bonnes pratiques production

  • Logging structuré : Écrivez des logs JSON ou structurés (ex: Winston pour Node.js) plutôt que du texte libre.
  • Niveaux de log : Utilisez les niveaux appropriés (debug en dev, info/warning/error en prod).
  • Centralisez les logs : En production, utilisez une stack centralisée (ELK, Loki, Splunk) plutôt que de relire des fichiers serveur par serveur.
  • Alertes automatiques : Configurez des alertes sur les erreurs critiques (5xx, timeouts, crashes).
  • Rotation des logs : Configurez la rétention pour éviter de saturer le disque.
  • Sécurité : Les logs peuvent contenir des données sensibles (tokens, IPs). Chiffrez et limitez l'accès.
  • Monitoring des services : Utilisez healthchecks et notifications pour détecter rapidement les arrêts non attendus.
À retenir : En production, ne vous fiez jamais à des logs manuels. Investissez dans un système de monitoring centralisé qui vous alertera automatiquement.

Conclusion

Systemd et journalctl sont les outils incontournables pour la gestion des services et des logs sur Linux moderne. Maîtriser ces outils est essentiel pour tout administrateur ou développeur DevOps. Les points clés à retenir :

  • systemctl contrôle les services (start, stop, restart, enable, disable)
  • journalctl offre un accès puissant aux logs avec filtrage avancé
  • Créez des services personnalisés pour automatiser vos applications
  • Configurez la rétention des logs pour ne pas saturer le disque
  • Implémentez un monitoring centralisé pour être alerté des problèmes rapidement

Avec ces compétences, vous serez capable de gérer efficacement vos serveurs en production et de diagnostiquer rapidement les problèmes rencontrés.