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

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/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