Aller au contenu
Administration Linux medium

Configurer logrotate pour gérer la rotation des logs sous Linux

10 min de lecture

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.

  • 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

logrotate est indispensable dès qu’un service écrit dans des fichiers texte :

  • Nginx ou Apache produisent des access.log et error.log qui 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 /var se 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 »
OutilGèreStockageConfiguration
journaldJournal binaire systemd/var/log/journal/journald.conf
logrotateFichiers texte classiques/var/log/*.loglogrotate.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.

logrotate est préinstallé sur la plupart des distributions. Sinon :

Fenêtre de terminal
sudo apt update && sudo apt install logrotate
Fenêtre de terminal
# Vérifier la version
logrotate --version
logrotate 3.21.0

La configuration de logrotate repose sur deux niveaux :

FichierRôle
/etc/logrotate.confRègles globales par défaut (fréquence, rétention)
/etc/logrotate.d/Un fichier par service qui surcharge les règles globales
Fenêtre de terminal
cat /etc/logrotate.conf
weekly
rotate 4
create
dateext
compress
include /etc/logrotate.d
DirectiveEffet
weeklyRotation hebdomadaire par défaut
rotate 4Conserver 4 fichiers archivés
createCréer un nouveau fichier après rotation
dateextSuffixer les archives avec la date (-20260628)
compressCompresser les archives (gzip)
include /etc/logrotate.dCharger les configurations par service

Chaque service place son fichier dans /etc/logrotate.d/. Exemple pour Nginx :

Fenêtre de terminal
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
}
DirectiveRotation
dailyChaque jour
weeklyChaque semaine
monthlyChaque mois
size 100MQuand le fichier dépasse 100 Mo
DirectiveEffet
rotate NGarder N archives
maxage NSupprimer les archives de plus de N jours
DirectiveEffet
compressCompresser les archives (gzip)
delaycompressReporter la compression d’un cycle (utile si un service écrit encore)
compresscmd bzip2Utiliser bzip2 au lieu de gzip
nocompressDésactiver la compression
create 0640 root adm

Crée le nouveau fichier avec les permissions 0640, propriétaire root, groupe adm. Le service peut continuer à écrire immédiatement.

DirectiveEffet
missingokNe pas signaler d’erreur si le fichier n’existe pas
notifemptyNe pas tourner un fichier vide
su root admExécuter la rotation avec cet utilisateur/groupe (requis si le dossier a des permissions spéciales)

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
}
BlocQuand
prerotate ... endscriptAvant la rotation
postrotate ... endscriptAprès la rotation
firstaction ... endscriptAvant la première rotation (une seule fois)
lastaction ... endscriptAprè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.

Fenêtre de terminal
sudo logrotate -d /etc/logrotate.d/nginx

Le 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.

Fenêtre de terminal
# Forcer la rotation de tous les fichiers
sudo logrotate -f /etc/logrotate.conf
# Forcer la rotation d'un seul service
sudo logrotate -f /etc/logrotate.d/nginx
Fenêtre de terminal
sudo logrotate -v /etc/logrotate.conf

Le flag -v affiche les détails de chaque rotation effectuée.

Sur les distributions modernes, logrotate est déclenché par un timer systemd (et non plus par cron) :

Fenêtre de terminal
systemctl cat logrotate.timer
[Timer]
OnCalendar=daily
AccuracySec=12h
Persistent=true
Fenêtre de terminal
# Vérifier que le timer est actif
systemctl status logrotate.timer

Voici un exemple de politique pour une application métier :

  1. Créer le fichier de configuration

    Fenêtre de terminal
    sudo nano /etc/logrotate.d/monapp
  2. Écrire la politique

    /var/log/monapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 monapp monapp
    su monapp monapp
    sharedscripts
    postrotate
    systemctl reload monapp > /dev/null 2>&1 || true
    endscript
    }
  3. Tester la configuration

    Fenêtre de terminal
    sudo logrotate -d /etc/logrotate.d/monapp

    Vérification : la sortie doit afficher les fichiers qui seraient tournés, sans erreur de syntaxe.

  4. Forcer une première rotation pour valider

    Fenêtre de terminal
    sudo logrotate -f /etc/logrotate.d/monapp
    ls -la /var/log/monapp/

    Vérification : un fichier .1.gz ou daté doit apparaître.

SymptômeCause probableSolution
Logs jamais tournésTimer désactivésystemctl enable --now logrotate.timer
error: skipping ... not readablePermissions insuffisantesAjouter su root adm ou su root root
Logs tournés mais service écrit dans l’ancienPas de postrotateAjouter un bloc postrotate avec systemctl reload
error: ... duplicate log entryMême fichier dans 2 configsVérifier /etc/logrotate.d/ pour les doublons
Archives non compresséescompress absentAjouter compress dans la configuration
Fichier .1 mais pas .1.gzdelaycompress actifNormal — la compression s’applique au cycle suivant
Fenêtre de terminal
# Diagnostic rapide
systemctl 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 ?
  • Toujours tester avec -d avant de modifier une politique en production
  • Utiliser delaycompress pour les services qui peuvent encore écrire dans l’ancien fichier pendant quelques secondes
  • Ajouter sharedscripts + postrotate pour recharger le service après rotation
  • Définir des permissions restrictives avec create — les logs contiennent souvent des informations sensibles (IP, erreurs, chemins)
  • Configurer maxage en complément de rotate — 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 dans logrotate.conf
  • Surveiller l’espace disque — logrotate ne résout pas le problème si les logs croissent plus vite que la rotation
  • 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 -d simule la rotation sans rien modifier — à utiliser avant chaque changement
  • logrotate -f force la rotation — utile pour valider une nouvelle configuration
  • Le bloc postrotate recharge 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

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn