TL;DR — Résumé Rapide
Logrotate automatise la rotation des logs sous Linux. Directives clés, scripts postrotate, rotation par taille et comment tester votre configuration.
Gérer les fichiers de log sous Linux est une tâche opérationnelle courante qui, lorsqu’elle est négligée, conduit à des disques pleins, des performances dégradées et des services défaillants. Logrotate est l’outil standard pour automatiser la rotation, la compression et le nettoyage des logs sur pratiquement toutes les distributions Linux. Ce guide couvre tout, depuis la configuration globale jusqu’aux exemples par application, les stratégies de test et la résolution de problèmes réels.
Prérequis
- Serveur Linux sous Ubuntu, Debian, RHEL ou une distribution compatible.
logrotateinstallé (apt install logrotateouyum install logrotate).- Familiarité de base avec la ligne de commande et la gestion des services via
systemctl. - Accès root ou sudo pour éditer
/etc/logrotate.confet/etc/logrotate.d/.
Fonctionnement de Logrotate
Logrotate ne s’exécute pas comme un démon. Il est invoqué quotidiennement par l’entrée cron dans /etc/cron.daily/logrotate. À chaque exécution, il lit sa configuration, consulte le fichier d’état dans /var/lib/logrotate/status pour savoir quand chaque log a été tourné pour la dernière fois, et agit uniquement lorsque l’intervalle planifié s’est écoulé.
# Vérifier le fichier d'état manuellement
cat /var/lib/logrotate/status
Le fichier d’état contient des entrées comme :
"/var/log/nginx/access.log" 2026-3-21-6:0:0
"/var/log/syslog" 2026-3-22-6:0:0
Si ce fichier est corrompu ou supprimé, logrotate tournera tous les logs à sa prochaine exécution comme s’ils n’avaient jamais été tournés.
Config Globale vs Configs par Application
/etc/logrotate.conf — Valeurs par Défaut Globales
Ce fichier définit les valeurs par défaut héritées par toutes les configurations :
# Rotation hebdomadaire par défaut
weekly
# Conserver 4 rotations
rotate 4
# Compresser les logs tournés
compress
# Charger les configs par application
include /etc/logrotate.d
/etc/logrotate.d/ — Surcharges par Application
Chaque fichier dans ce répertoire configure la rotation d’une application :
/var/log/nginx/access.log /var/log/nginx/error.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
postrotate
systemctl reload nginx
endscript
}
Directives Clés
| Directive | Effet |
|---|---|
daily / weekly / monthly | Fréquence de rotation |
rotate N | Nombre de fichiers tournés à conserver avant suppression |
compress | Comprimer les fichiers tournés avec gzip |
delaycompress | Comprimer la rotation précédente, pas celle qui vient d’être effectuée |
missingok | Ignorer silencieusement si le fichier de log est absent |
notifempty | Ne pas tourner si le log est vide |
create mode propriétaire groupe | Créer un nouveau log vide avec ces permissions après rotation |
sharedscripts | Exécuter postrotate une seule fois pour tous les fichiers correspondants |
dateext | Ajouter une date plutôt qu’un numéro au nom du fichier tourné |
size N / minsize N / maxsize N | Déclencher la rotation selon la taille du fichier |
copytruncate vs postrotate
postrotate / endscript (recommandé)
Après que logrotate renomme le fichier de log, le bloc postrotate exécute une commande qui demande à l’application de fermer l’ancien descripteur et d’ouvrir le nouveau fichier vide :
postrotate
systemctl reload nginx
# ou pour les processus qui utilisent SIGUSR1 :
kill -USR1 $(cat /var/run/gunicorn.pid) 2>/dev/null || true
endscript
copytruncate
Certaines applications ne peuvent pas recharger leurs descripteurs de fichier. copytruncate demande à logrotate de copier le fichier vers le nom tourné puis de tronquer l’original à zéro octet :
/var/log/monapp/app.log {
daily
rotate 7
compress
delaycompress
copytruncate
}
Attention : Il existe une petite fenêtre entre la copie et la troncature où de nouvelles lignes peuvent être écrites dans le fichier original et perdues de l’archive tournée. Pour les logs à haut volume, préférez postrotate dans la mesure du possible.
Rotation Basée sur la Taille
/var/log/monapp/app.log {
# Tourner quand le fichier dépasse 100 Mo indépendamment du planning
size 100M
# Tourner quand le fichier atteint au moins 10 Mo ET que l'intervalle est écoulé
# minsize 10M
# Tourner immédiatement quand le fichier dépasse 500 Mo
# maxsize 500M
rotate 10
compress
delaycompress
missingok
notifempty
}
Exemples par Application
Nginx
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
nginx -s reopen
endscript
}
Docker
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
La solution préférée à long terme est de configurer le démon Docker avec "log-opts": {"max-size": "100m", "max-file": "5"} dans /etc/docker/daemon.json.
Logs d’Application dans /var/log/monapp/
/var/log/monapp/*.log {
daily
rotate 14
size 50M
compress
delaycompress
missingok
notifempty
create 0640 monapp monapp
sharedscripts
postrotate
systemctl reload monapp 2>/dev/null || true
endscript
}
Noms de Fichiers Datés avec dateext
Par défaut, logrotate ajoute des suffixes numériques : access.log.1, access.log.2.gz. Activez dateext pour des noms lisibles avec date :
/var/log/nginx/*.log {
daily
rotate 30
dateext
dateformat -%Y-%m-%d
compress
delaycompress
missingok
}
Cela produit des noms comme access.log-2026-03-22.gz.
Tester la Configuration
Simulation (Sans Risque)
sudo logrotate -d /etc/logrotate.d/nginx
Forcer la Rotation
sudo logrotate -f /etc/logrotate.d/nginx
Mode Verbeux
sudo logrotate -v /etc/logrotate.conf
Dépannage
| Problème | Cause | Solution |
|---|---|---|
| Rotation effectuée mais les logs continuent de grossir | notifempty ignore les logs vides, ou l’app ne respecte pas le reload | Vérifiez si le log a du contenu ; confirmez que l’app rouvre les fichiers avec systemctl reload |
| Permissions non sécurisées sur le répertoire parent | logrotate refuse les répertoires inscriptibles par tous | Corrigez les permissions : chmod o-w /var/log/monapp |
| Fichiers tournés non compressés | compress absent ou utilisé sans delaycompress | Ajoutez delaycompress pour comprimer au cycle suivant |
| SELinux bloque la rotation | Mauvais contexte SELinux sur les fichiers tournés | Lancez restorecon -v /var/log/monapp/*.log |
| Corruption du fichier d’état | Modifications manuelles ou erreurs système de fichiers | Supprimez /var/lib/logrotate/status — logrotate le recrée automatiquement |
Script postrotate échoue silencieusement | Code de sortie différent de zéro | Ajoutez ` |
Comparaison : Logrotate vs Autres Approches
| Outil | Mécanisme | Idéal Pour |
|---|---|---|
| logrotate | Rotation de fichiers déclenchée par cron avec règles configurables | Fichiers de log traditionnels dans /var/log/ |
| systemd-journald | Journal binaire avec limites SystemMaxUse et MaxFileSec | Entrées de journal des services systemd (journalctl) |
| rsyslog intégré | Module om file avec directives de rotation | Environnements avec transfert centralisé via rsyslog |
| Drivers Docker | Driver json-file avec max-size et max-file | Logs stdout/stderr des conteneurs gérés par Docker |
| Fluentd / Vector | Envoi vers stockage distant ; pas de rotation locale | Environnements cloud-native avec agrégation centralisée |
Résumé
- Logrotate s’exécute quotidiennement via
/etc/cron.daily/logrotateet utilise/var/lib/logrotate/statuspour suivre les dates de rotation. - Les valeurs par défaut globales sont dans
/etc/logrotate.conf; les configs par app vont dans/etc/logrotate.d/. - Utilisez
postrotateavecsystemctl reloadoukill -USR1dans la mesure du possible — préférez-le àcopytruncate. - Ajoutez
delaycompressaveccompresspour ne pas comprimer des fichiers encore ouverts par des processus actifs. - Utilisez
size,minsizeoumaxsizepour les services susceptibles de générer des logs volumineux de façon inattendue. - Testez toujours avec
logrotate -davant de déployer une nouvelle configuration en production. - Les noms datés (
dateext) facilitent considérablement la gestion et l’audit des archives de logs.