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.
  • logrotate installé (apt install logrotate ou yum 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.conf et /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

DirectiveEffet
daily / weekly / monthlyFréquence de rotation
rotate NNombre de fichiers tournés à conserver avant suppression
compressComprimer les fichiers tournés avec gzip
delaycompressComprimer la rotation précédente, pas celle qui vient d’être effectuée
missingokIgnorer silencieusement si le fichier de log est absent
notifemptyNe pas tourner si le log est vide
create mode propriétaire groupeCréer un nouveau log vide avec ces permissions après rotation
sharedscriptsExécuter postrotate une seule fois pour tous les fichiers correspondants
dateextAjouter une date plutôt qu’un numéro au nom du fichier tourné
size N / minsize N / maxsize NDé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èmeCauseSolution
Rotation effectuée mais les logs continuent de grossirnotifempty ignore les logs vides, ou l’app ne respecte pas le reloadVé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 parentlogrotate refuse les répertoires inscriptibles par tousCorrigez les permissions : chmod o-w /var/log/monapp
Fichiers tournés non compresséscompress absent ou utilisé sans delaycompressAjoutez delaycompress pour comprimer au cycle suivant
SELinux bloque la rotationMauvais contexte SELinux sur les fichiers tournésLancez restorecon -v /var/log/monapp/*.log
Corruption du fichier d’étatModifications manuelles ou erreurs système de fichiersSupprimez /var/lib/logrotate/status — logrotate le recrée automatiquement
Script postrotate échoue silencieusementCode de sortie différent de zéroAjoutez `

Comparaison : Logrotate vs Autres Approches

OutilMécanismeIdéal Pour
logrotateRotation de fichiers déclenchée par cron avec règles configurablesFichiers de log traditionnels dans /var/log/
systemd-journaldJournal binaire avec limites SystemMaxUse et MaxFileSecEntrées de journal des services systemd (journalctl)
rsyslog intégréModule om file avec directives de rotationEnvironnements avec transfert centralisé via rsyslog
Drivers DockerDriver json-file avec max-size et max-fileLogs stdout/stderr des conteneurs gérés par Docker
Fluentd / VectorEnvoi vers stockage distant ; pas de rotation localeEnvironnements cloud-native avec agrégation centralisée

Résumé

  • Logrotate s’exécute quotidiennement via /etc/cron.daily/logrotate et utilise /var/lib/logrotate/status pour 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 postrotate avec systemctl reload ou kill -USR1 dans la mesure du possible — préférez-le à copytruncate.
  • Ajoutez delaycompress avec compress pour ne pas comprimer des fichiers encore ouverts par des processus actifs.
  • Utilisez size, minsize ou maxsize pour les services susceptibles de générer des logs volumineux de façon inattendue.
  • Testez toujours avec logrotate -d avant 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.

Articles Connexes