Dans les architectures de microservices, les fichiers nohup.out accumulent souvent des erreurs critiques non captées par les mécanismes de journalisation internes. Sans rtoation, ces fichiers deviennent ingérables. L'outil logrotate offre une solution robuste pour automatiser ce processus.
Implémentation avec logrotate
Créons un fichier de configuration dédié dans /etc/logrotate.d/mes_services :
/opt/depots/serveur-web/logs/nohup.out
/opt/depots/api-backend/logs/nohup.out
/opt/depots/worker-async/logs/nohup.out
{
create 0640
daily
dateext
rotate 5
missingok
notifempty
copytruncate
compress
delaycompress
su root syslog
}
Analyse des paramètres :
- create 0640 : Initialise un nouveau fichier avec les permissions lecture/écriture pour le propriétaire et lecture pour le groupe.
- daily : Déclenche la rotation chaque jour. Variantes : weekly, month.
- dateext : Utilise le format YYYYMMDD comme suffixe pour les archives.
- rotate 5 : Conserve cinq rotations historiques avant suppression des plus anciennes.
- missingok : Poursuit l'exécution si un fichier cible est absent.
- notifempty : Ignore les fichiers de taille nulle.
- copytruncate : Duplique le contenu avant de vider le fichier source. Risque minime de perte d'événements durant l'intervalle de copie.
- compress : Applique gzip aux archives immédiatement.
- delaycompress : Retarde la compression d'une rotation pour les logs actifs.
- su root syslog : Exécute les opérations sous l'identité root avec le groupe syslog.
Validation et exécution
Testons d'abord en mode simulation :
logrotate --debug --force /etc/logrotate.d/mes_services
L'absence d'erreurs confirme la validité. Exécutons une rotation manuelle :
logrotate --force /etc/logrotate.d/mes_services
Vérification des résultats :
tree -L 2 /opt/depots/
# Résultat attendu :
# ├── serveur-web/logs
# │ ├── nohup.out
# │ └── nohup.out-20231015.gz
# ├── api-backend/logs
# │ ├── nohup.out
# │ └── nohup.out-20231015.gz
Automatisation via le planificateur de tâches
La rotation automatique quotidienne est assurée par le script /etc/cron.daily/logrotate :
#!/bin/bash
/usr/sbin/logrotate /etc/logrotate.conf
statut=$?
if [ $statut -ne 0 ]; then
logger -t logrotate "Échec avec code $statut"
fi
Ce mécanisme garantit une exécution régulière tant que le service cron est opérationnel, élmiinant ainsi toute intervention manuelle.