logrotate archive, compresse et supprime automatiquement les anciens fichiers de log (/var/log/*.log). Tandis que journald gère le journal binaire de systemd, logrotate s’occupe des fichiers texte produits par les services qui écrivent directement dans /var/log/ (Nginx, Apache, MySQL, applications métier). Sans rotation, ces fichiers grossissent jusqu’à remplir le disque.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre l’architecture de logrotate (
logrotate.conf+/etc/logrotate.d/) - Lire et écrire une politique de rotation pour un service
- Utiliser les directives de compression, rétention et permissions
- Exécuter des scripts post-rotation (redémarrage de service)
- Tester une configuration sans risque et forcer une rotation manuelle
- Connaître la différence entre logrotate et journald
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »logrotate est indispensable dès qu’un service écrit dans des fichiers texte :
- Nginx ou Apache produisent des
access.logeterror.logqui peuvent atteindre plusieurs Go par jour sur un site actif - Une application métier écrit ses logs dans
/var/log/monapp/sans aucune rotation intégrée - Le disque
/varse remplit et déclenche des alertes — il faut compresser et purger les anciens logs - La conformité exige de conserver les logs 90 jours mais pas indéfiniment
logrotate et journald — deux rôles complémentaires
Section intitulée « logrotate et journald — deux rôles complémentaires »| Outil | Gère | Stockage | Configuration |
|---|---|---|---|
| journald | Journal binaire systemd | /var/log/journal/ | journald.conf |
| logrotate | Fichiers texte classiques | /var/log/*.log | logrotate.conf + /etc/logrotate.d/ |
Les deux coexistent sur un système moderne. journald capture les flux stdout/stderr des services systemd, les messages syslog et les logs du noyau. logrotate gère les fichiers texte que les services écrivent directement sur le disque.
Installation
Section intitulée « Installation »logrotate est préinstallé sur la plupart des distributions. Sinon :
sudo apt update && sudo apt install logrotatesudo dnf install logrotate# Vérifier la versionlogrotate --versionlogrotate 3.21.0Architecture de la configuration
Section intitulée « Architecture de la configuration »La configuration de logrotate repose sur deux niveaux :
| Fichier | Rôle |
|---|---|
/etc/logrotate.conf | Règles globales par défaut (fréquence, rétention) |
/etc/logrotate.d/ | Un fichier par service qui surcharge les règles globales |
Configuration globale
Section intitulée « Configuration globale »cat /etc/logrotate.confweeklyrotate 4createdateextcompressinclude /etc/logrotate.d| Directive | Effet |
|---|---|
weekly | Rotation hebdomadaire par défaut |
rotate 4 | Conserver 4 fichiers archivés |
create | Créer un nouveau fichier après rotation |
dateext | Suffixer les archives avec la date (-20260628) |
compress | Compresser les archives (gzip) |
include /etc/logrotate.d | Charger les configurations par service |
Configuration par service
Section intitulée « Configuration par service »Chaque service place son fichier dans /etc/logrotate.d/. Exemple pour Nginx :
cat /etc/logrotate.d/nginx/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate if [ -d /run/systemd/system ]; then systemctl reload nginx > /dev/null 2>&1 || true fi endscript}Directives essentielles
Section intitulée « Directives essentielles »Fréquence
Section intitulée « Fréquence »| Directive | Rotation |
|---|---|
daily | Chaque jour |
weekly | Chaque semaine |
monthly | Chaque mois |
size 100M | Quand le fichier dépasse 100 Mo |
Rétention
Section intitulée « Rétention »| Directive | Effet |
|---|---|
rotate N | Garder N archives |
maxage N | Supprimer les archives de plus de N jours |
Compression
Section intitulée « Compression »| Directive | Effet |
|---|---|
compress | Compresser les archives (gzip) |
delaycompress | Reporter la compression d’un cycle (utile si un service écrit encore) |
compresscmd bzip2 | Utiliser bzip2 au lieu de gzip |
nocompress | Désactiver la compression |
Création du nouveau fichier
Section intitulée « Création du nouveau fichier »create 0640 root admCrée le nouveau fichier avec les permissions 0640, propriétaire root, groupe adm. Le service peut continuer à écrire immédiatement.
Sécurité
Section intitulée « Sécurité »| Directive | Effet |
|---|---|
missingok | Ne pas signaler d’erreur si le fichier n’existe pas |
notifempty | Ne pas tourner un fichier vide |
su root adm | Exécuter la rotation avec cet utilisateur/groupe (requis si le dossier a des permissions spéciales) |
Scripts pre et post-rotation
Section intitulée « Scripts pre et post-rotation »Les blocs prerotate et postrotate permettent d’exécuter des commandes avant et après la rotation :
/var/log/myapp/*.log { daily rotate 7 compress missingok notifempty create 0640 myapp myapp sharedscripts postrotate systemctl reload myapp > /dev/null 2>&1 || true endscript}| Bloc | Quand |
|---|---|
prerotate ... endscript | Avant la rotation |
postrotate ... endscript | Après la rotation |
firstaction ... endscript | Avant la première rotation (une seule fois) |
lastaction ... endscript | Après la dernière rotation (une seule fois) |
sharedscripts garantit que le script ne s’exécute qu’une seule fois, même si plusieurs fichiers correspondent au pattern.
Tester et exécuter
Section intitulée « Tester et exécuter »Tester sans appliquer (mode debug)
Section intitulée « Tester sans appliquer (mode debug) »sudo logrotate -d /etc/logrotate.d/nginxLe flag -d simule la rotation et affiche ce qui serait fait, sans modifier aucun fichier. Utilisez-le systématiquement avant de mettre en production une nouvelle configuration.
Forcer la rotation
Section intitulée « Forcer la rotation »# Forcer la rotation de tous les fichierssudo logrotate -f /etc/logrotate.conf
# Forcer la rotation d'un seul servicesudo logrotate -f /etc/logrotate.d/nginxMode verbose
Section intitulée « Mode verbose »sudo logrotate -v /etc/logrotate.confLe flag -v affiche les détails de chaque rotation effectuée.
Déclenchement automatique
Section intitulée « Déclenchement automatique »Sur les distributions modernes, logrotate est déclenché par un timer systemd (et non plus par cron) :
systemctl cat logrotate.timer[Timer]OnCalendar=dailyAccuracySec=12hPersistent=true# Vérifier que le timer est actifsystemctl status logrotate.timerÉcrire une politique complète
Section intitulée « Écrire une politique complète »Voici un exemple de politique pour une application métier :
-
Créer le fichier de configuration
Fenêtre de terminal sudo nano /etc/logrotate.d/monapp -
Écrire la politique
/var/log/monapp/*.log {dailyrotate 30compressdelaycompressmissingoknotifemptycreate 0640 monapp monappsu monapp monappsharedscriptspostrotatesystemctl reload monapp > /dev/null 2>&1 || trueendscript} -
Tester la configuration
Fenêtre de terminal sudo logrotate -d /etc/logrotate.d/monappVérification : la sortie doit afficher les fichiers qui seraient tournés, sans erreur de syntaxe.
-
Forcer une première rotation pour valider
Fenêtre de terminal sudo logrotate -f /etc/logrotate.d/monappls -la /var/log/monapp/Vérification : un fichier
.1.gzou daté doit apparaître.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Logs jamais tournés | Timer désactivé | systemctl enable --now logrotate.timer |
error: skipping ... not readable | Permissions insuffisantes | Ajouter su root adm ou su root root |
| Logs tournés mais service écrit dans l’ancien | Pas de postrotate | Ajouter un bloc postrotate avec systemctl reload |
error: ... duplicate log entry | Même fichier dans 2 configs | Vérifier /etc/logrotate.d/ pour les doublons |
| Archives non compressées | compress absent | Ajouter compress dans la configuration |
Fichier .1 mais pas .1.gz | delaycompress actif | Normal — la compression s’applique au cycle suivant |
# Diagnostic rapidesystemctl status logrotate.timer # Timer actif ?sudo logrotate -d /etc/logrotate.conf # Erreurs de config ?ls -la /var/log/nginx/ # Rotation effective ?journalctl -u logrotate.service # Dernière exécution ?Bonnes pratiques
Section intitulée « Bonnes pratiques »- Toujours tester avec
-davant de modifier une politique en production - Utiliser
delaycompresspour les services qui peuvent encore écrire dans l’ancien fichier pendant quelques secondes - Ajouter
sharedscripts+postrotatepour recharger le service après rotation - Définir des permissions restrictives avec
create— les logs contiennent souvent des informations sensibles (IP, erreurs, chemins) - Configurer
maxageen complément derotate— supprimer les archives trop anciennes même si le compteur n’est pas atteint - Séparer les configurations dans
/etc/logrotate.d/— un fichier par service, jamais tout danslogrotate.conf - Surveiller l’espace disque — logrotate ne résout pas le problème si les logs croissent plus vite que la rotation
À retenir
Section intitulée « À retenir »- logrotate gère les fichiers de log texte — journald gère le journal binaire de systemd. Les deux sont complémentaires
- La configuration globale est dans
/etc/logrotate.conf, les configurations par service dans/etc/logrotate.d/ - Les directives clés :
daily/weekly,rotate N,compress,delaycompress,create,postrotate logrotate -dsimule la rotation sans rien modifier — à utiliser avant chaque changementlogrotate -fforce la rotation — utile pour valider une nouvelle configuration- Le bloc
postrotaterecharge le service pour qu’il écrive dans le nouveau fichier - Sur les systèmes modernes, logrotate est déclenché par un timer systemd (
logrotate.timer), plus par cron