LOGROTATE — GESTION DU CYCLE DE VIE DES LOGS Log Croissant access.log 2.4 GB Disque: 95% logrotate Pivoter Compresser Purger anciens Signaler app Fichiers Pivotes access.log (nouv.) access.log.1.gz 120K access.log.2.gz 115K access.log.3.gz 118K Disque: 12% Minuteur systemd logrotate.timer Execution quotid. Config /etc/logrotate.conf /etc/logrotate.d/ Regles par app Cycle de vie automatise : pivoter, compresser, purger, repeter

Les fichiers de log grossissent silencieusement en arriere-plan de chaque serveur Linux. Serveurs web, frameworks applicatifs, bases de donnees et demons systeme ecrivent dans les fichiers de log en permanence. Sans controle, ces fichiers consommeront tout l’espace disque disponible, provoquant a terme des interruptions de service, des echecs d’ecriture et des performances degradees. Logrotate est l’utilitaire standard sous Linux qui resout ce probleme en effectuant automatiquement la rotation, la compression et la suppression des anciens fichiers de log selon un calendrier que vous definissez.

Ce guide couvre tout ce dont vous avez besoin pour configurer logrotate efficacement : la configuration globale, les configurations par application, les configurations specifiques a Nginx, les scripts de post-rotation, et comment resoudre les problemes quand les choses tournent mal.

Prerequis

Avant de commencer, assurez-vous d’avoir :

  • Un serveur Linux sous Ubuntu 20.04, 22.04 ou 24.04 (les instructions s’appliquent egalement a Debian et a la plupart des distributions basees sur RHEL)
  • Un acces terminal avec les privileges sudo
  • Une connaissance de base de la ligne de commande et de l’edition de texte (nano ou vim)
  • Des fichiers de log a gerer (serveur web, application ou logs systeme)

Qu’est-ce que Logrotate ?

Logrotate est un utilitaire systeme concu pour simplifier l’administration des fichiers de log. Il automatise la rotation, la compression et la suppression des fichiers de log afin qu’ils ne saturent pas votre systeme de fichiers. Logrotate est pre-installe sur pratiquement toutes les distributions Linux et constitue l’outil standard de gestion des logs depuis des decennies.

Ce que fait logrotate :

  • Effectue la rotation des fichiers de log en les renommant avec un suffixe numerique ou un horodatage
  • Compresse les anciens fichiers de log avec gzip (ou d’autres algorithmes) pour economiser de l’espace disque
  • Supprime les fichiers de log plus anciens qu’un nombre specifie de rotations
  • Signale aux applications de rouvrir leurs fichiers de log apres la rotation
  • Execute des scripts personnalises avant ou apres la rotation
# Verify logrotate is installed
logrotate --version

# Expected output:
# logrotate 3.21.0

Pourquoi la Rotation des Logs est Importante

Sans rotation des logs, un serveur Nginx charge generant 50 000 requetes par jour peut produire des logs d’acces qui grossissent de centaines de megaoctets quotidiennement. En quelques semaines ou mois, ces fichiers atteignent des gigaoctets. Les consequences sont previsibles :

  • Disque plein — les services plantent lorsque le systeme de fichiers atteint 100% de capacite
  • Analyse lente des logs — des outils comme grep et awk deviennent impraticables sur des fichiers de plusieurs gigaoctets
  • Sauvegardes gonflees — les logs non compresses gonflent la taille des sauvegardes et les temps de transfert
  • Risque de conformite — certaines reglementations exigent des politiques de retention des logs avec des calendriers de purge definis

Une configuration simple de logrotate previent tous ces problemes sans aucun effort continu.

Comment Fonctionne Logrotate

Logrotate suit un flux d’execution simple :

  1. Un timer systemd declenche logrotate quotidiennement — Sur les systemes Ubuntu modernes, l’unite logrotate.timer execute logrotate.service une fois par jour. Sur les systemes plus anciens, une tache cron dans /etc/cron.daily/logrotate s’en chargeait.

  2. Logrotate lit sa configuration — Il charge /etc/logrotate.conf (la configuration globale), qui inclut tous les fichiers sous /etc/logrotate.d/.

  3. Il verifie chaque fichier de log par rapport a ses regles — En fonction des directives (daily, size, etc.), logrotate determine si chaque fichier de log doit etre pivote.

  4. La rotation s’effectue — Le fichier de log actuel est renomme (par exemple, access.log devient access.log.1), et un nouveau fichier vide est cree. Les fichiers pivotes precedents sont renumerotes (access.log.1 devient access.log.2, etc.).

  5. La compression s’execute — Les fichiers pivotes sont compresses (generalement avec gzip), avec delaycompress qui attend un cycle avant de compresser.

  6. Les scripts de post-rotation s’executent — Les commandes a l’interieur des blocs postrotate/endscript s’executent, envoyant generalement un signal a l’application pour qu’elle rouvre son fichier de log.

Verifiez que le timer est actif :

# Check the systemd timer
systemctl status logrotate.timer

# See when it last ran and when it will run next
systemctl list-timers logrotate

Configuration Globale (/etc/logrotate.conf)

Le fichier de configuration globale definit les directives par defaut qui s’appliquent a tous les fichiers de log sauf si elles sont remplacees par des configurations specifiques a une application.

# View the global configuration
cat /etc/logrotate.conf

Une configuration par defaut typique ressemble a ceci :

# /etc/logrotate.conf

# Rotate log files weekly
weekly

# Keep 4 weeks of rotated logs
rotate 4

# Create new (empty) log files after rotating old ones
create

# Use date as a suffix of the rotated file
dateext

# Compress rotated log files
compress

# Packages drop their config snippets into this directory
include /etc/logrotate.d

Points cles concernant la configuration globale :

  • weekly — Effectue la rotation des logs une fois par semaine. C’est le calendrier par defaut.
  • rotate 4 — Conserve 4 fichiers pivotes avant de supprimer le plus ancien. Avec une rotation hebdomadaire, cela conserve un mois de logs.
  • create — Apres la rotation, cree un nouveau fichier de log vide avec les memes permissions que l’original.
  • dateext — Ajoute la date (par exemple, -20260114) au lieu d’un suffixe numerique aux fichiers pivotes.
  • compress — Compresse les fichiers pivotes avec gzip.
  • include /etc/logrotate.d — Charge tous les fichiers de configuration specifiques aux applications depuis ce repertoire.

Configurations Specifiques par Application (/etc/logrotate.d/)

Chaque application peut avoir son propre fichier de configuration logrotate dans /etc/logrotate.d/. Ces fichiers remplacent les valeurs par defaut globales pour des fichiers de log specifiques.

# List all application-specific configs
ls -la /etc/logrotate.d/

# Common files you might see:
# apt        dpkg       nginx      rsyslog
# alternatives  cups    samba      ufw

Chaque fichier suit le meme format : un chemin de fichier de log (ou un motif glob), suivi de directives entre accolades.

# Example: /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

Directives de Configuration Expliquees

Logrotate offre des dizaines de directives pour controler exactement le comportement de la rotation. Voici les plus importantes :

Frequence de Rotation

daily       # Rotate every day
weekly      # Rotate once per week (default)
monthly     # Rotate once per month
yearly      # Rotate once per year

Retention

rotate 7    # Keep 7 rotated files before deleting the oldest
maxage 30   # Remove rotated logs older than 30 days

Compression

compress         # Compress rotated files (gzip by default)
delaycompress    # Wait one rotation cycle before compressing
compresscmd /usr/bin/xz    # Use xz instead of gzip
compressoptions "-9"       # Pass options to the compression command
nocompress       # Do not compress rotated files

Gestion des Fichiers

missingok     # Do not error if the log file is missing
notifempty    # Do not rotate the log if it is empty
create 0640 www-data adm    # Create new file with specific mode, owner, group
copytruncate  # Copy the log and truncate the original (for apps that hold the file open)

Nommage

dateext             # Use date-based suffixes (-20260114)
dateformat -%Y%m%d  # Customize the date format
extension .log      # Preserve the .log extension after the date suffix

Configuration Personnalisee pour Nginx

Nginx est l’un des services les plus courants qui necessite une configuration logrotate. Lorsque Nginx est installe depuis les paquets officiels, il inclut generalement un fichier de configuration, mais vous pourriez avoir besoin de le personnaliser.

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 14
    missingok
    notifempty
    compress
    delaycompress
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 $(cat /var/run/nginx.pid)
        fi
    endscript
}

Ce que fait chaque directive dans ce contexte :

  • /var/log/nginx/*.log — Applique ces regles a tous les fichiers .log du repertoire de logs Nginx
  • daily — Effectue la rotation chaque jour (remplace le weekly global)
  • rotate 14 — Conserve deux semaines de logs pivotes
  • delaycompress — Ne compresse pas le log d’hier immediatement ; cela permet aux outils d’analyse de le traiter d’abord
  • create 0640 www-data adm — Le nouveau fichier de log appartiendra a www-data avec le groupe adm, et les permissions 0640
  • sharedscripts — Execute le script postrotate une seule fois, meme si plusieurs fichiers de log correspondent au motif glob
  • postrotate — Envoie le signal USR1 a Nginx, qui lui indique de rouvrir ses fichiers de log sans redemarrer

Important : Le signal USR1 est specifique a Nginx. D’autres applications utilisent des signaux differents ou necessitent un redemarrage complet. Consultez toujours la documentation de votre service specifique.

Configuration Personnalisee pour les Logs Applicatifs

Pour les logs d’applications personnalisees (Rails, Node.js, Django, ou toute application qui ecrit ses propres logs), vous devez creer une configuration logrotate de zero.

# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    dateext
    dateformat -%Y%m%d
    maxage 90
}

Decisions cles pour les logs applicatifs :

  • copytruncate vs create — Si votre application ne peut pas rouvrir ses fichiers de log (de nombreuses applications Node.js et Python gardent le descripteur de fichier ouvert), utilisez copytruncate. Cela copie le contenu vers un fichier pivote puis tronque l’original. Il existe une courte fenetre ou des lignes de log peuvent etre perdues entre la copie et la troncature, mais pour la plupart des applications c’est acceptable.

  • rotate 30 avec maxage 90 — Conserve 30 fichiers pivotes, mais supprime egalement tout ce qui a plus de 90 jours. La directive maxage fournit un filet de securite.

  • dateext — Utilise des noms bases sur la date comme app.log-20260114.gz au lieu de noms numeriques comme app.log.1.gz. Cela facilite la recherche de logs a une date specifique.

Si votre application prend en charge la reouverture des logs par signal :

# /etc/logrotate.d/myapp-with-signal
/var/log/myapp/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    create 0644 appuser appgroup
    sharedscripts
    postrotate
        systemctl kill --signal=HUP myapp.service
    endscript
}

Scripts de Post-Rotation (postrotate/endscript)

Les scripts de post-rotation sont des blocs de commandes shell qui s’executent apres la rotation des logs. Ils sont essentiels pour signaler aux applications de rouvrir leurs fichiers de log.

postrotate
    # This block runs after rotation
    /usr/bin/systemctl reload nginx > /dev/null 2>&1 || true
endscript

Il existe egalement des scripts prerotate qui s’executent avant la rotation :

prerotate
    # This block runs before rotation
    if [ -d /etc/logrotate.d/httpd-prerotate ]; then
        run-parts /etc/logrotate.d/httpd-prerotate
    fi
endscript

Regles importantes pour les scripts de rotation :

  • Terminez toujours par || true ou ; true pour empecher les echecs de script d’arreter logrotate
  • Utilisez sharedscripts lorsque le chemin du log contient un motif glob — cela garantit que le bloc postrotate s’execute une seule fois au lieu d’une fois par fichier correspondant
  • Gardez les scripts minimaux et rapides — logrotate est bloque pendant l’execution des scripts
  • Testez les scripts manuellement avant de les ajouter a une configuration logrotate

Motifs de signaux courants pour les services populaires :

# Nginx -- reopen log files
kill -USR1 $(cat /var/run/nginx.pid)

# Apache -- graceful restart
/usr/sbin/apachectl graceful > /dev/null 2>&1

# rsyslog -- reopen log files
/usr/lib/rsyslog/rsyslog-rotate

# systemd service -- generic signal
systemctl kill --signal=HUP myservice.service

Tests et Debogage

Testez toujours vos configurations logrotate avant d’attendre que le timer quotidien les declenche.

Mode Debogage (Execution a Blanc)

Le mode debogage simule la rotation sans effectuer aucune modification. Il montre exactement ce que logrotate ferait :

# Test a specific config file
sudo logrotate -d /etc/logrotate.d/nginx

# Test the entire configuration
sudo logrotate -d /etc/logrotate.conf

Exemple de sortie de debogage :

reading config file /etc/logrotate.d/nginx

Handling 1 logs

rotating pattern: /var/log/nginx/*.log  after 1 days (14 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  Now: 2026-01-14 10:00
  Last rotated at 2026-01-13 06:00
  log needs rotating
considering log /var/log/nginx/error.log
  Now: 2026-01-14 10:00
  Last rotated at 2026-01-13 06:00
  log needs rotating

Forcer la Rotation

Forcez une rotation immediate quel que soit le calendrier :

# Force rotation for a specific config
sudo logrotate -f /etc/logrotate.d/nginx

# Force rotation with verbose output
sudo logrotate -vf /etc/logrotate.d/nginx

Verification du Fichier d’Etat

Logrotate enregistre la date de derniere rotation de chaque fichier de log dans un fichier d’etat :

# View the state file
cat /var/lib/logrotate/status

# You'll see entries like:
# "/var/log/nginx/access.log" 2026-1-14-6:0:0
# "/var/log/nginx/error.log" 2026-1-14-6:0:0
# "/var/log/syslog" 2026-1-13-6:0:0

Si logrotate ne pivote pas un fichier que vous attendez, verifiez ce fichier d’etat. Si la date de derniere rotation est recente, logrotate ignorera le fichier jusqu’a ce que le prochain intervalle de rotation soit ecoule.

Rotation Basee sur la Taille vs Basee sur le Temps

Logrotate prend en charge la rotation basee sur le temps et sur la taille, et vous pouvez les combiner.

Basee sur le Temps Uniquement

/var/log/myapp/*.log {
    daily        # Rotate every day regardless of file size
    rotate 7
    compress
}

Basee sur la Taille Uniquement

/var/log/myapp/*.log {
    size 100M    # Rotate only when the file exceeds 100 MB
    rotate 5
    compress
}

Combinee : Basee sur le Temps avec Limites de Taille

/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    maxsize 200M    # Also rotate if file exceeds 200 MB before the daily schedule
    minsize 1M      # Do not rotate if the file is smaller than 1 MB, even on schedule
}

Differences cles :

  • size remplace entierement la rotation basee sur le temps — logrotate ne verifie que la taille du fichier
  • maxsize fonctionne conjointement avec la rotation basee sur le temps — pivote selon le calendrier OU lorsque la taille est depassee, selon ce qui survient en premier
  • minsize empeche la rotation des petits fichiers de log — le log doit avoir au moins cette taille ET l’intervalle de temps doit etre ecoule

Pour les serveurs a fort trafic, la combinaison de daily avec maxsize offre le meilleur equilibre entre calendriers previsibles et protection de l’espace disque.

Tableau de Reference des Directives Logrotate

DirectiveDescriptionExemple
dailyPivote les fichiers de log chaque jourdaily
weeklyPivote les fichiers de log une fois par semaineweekly
monthlyPivote les fichiers de log une fois par moismonthly
rotate NConserve N fichiers pivotes avant suppressionrotate 7
compressCompresse les fichiers pivotes avec gzipcompress
delaycompressRetarde la compression d’un cycle de rotationdelaycompress
missingokNe genere pas d’erreur si le fichier de log est absentmissingok
notifemptyNe pivote pas si le fichier de log est videnotifempty
create mode owner groupCree un nouveau fichier de log avec les attributs specifiescreate 0640 www-data adm
copytruncateCopie le log puis tronque l’originalcopytruncate
size NPivote lorsque le fichier depasse N octets/Ko/Mosize 100M
maxsize NPivote selon le calendrier ou lorsque la taille depasse Nmaxsize 500M
minsize NNe pivote que si le fichier fait au moins Nminsize 1M
maxage NSupprime les fichiers pivotes de plus de N joursmaxage 90
dateextUtilise des suffixes bases sur la date pour les fichiers pivotesdateext
sharedscriptsExecute les scripts postrotate une seule fois pour tous les fichiers correspondantssharedscripts
postrotate/endscriptCommandes shell a executer apres la rotationVoir les exemples ci-dessus
prerotate/endscriptCommandes shell a executer avant la rotationVoir les exemples ci-dessus
olddir /cheminDeplace les fichiers pivotes vers un autre repertoireolddir /var/log/archive
su user groupExecute la rotation en tant qu’utilisateur et groupe specifiquessu root adm

Depannage

Logrotate ne Pivote Pas un Fichier

# 1. Check for syntax errors
sudo logrotate -d /etc/logrotate.d/yourconfig

# 2. Verify the log file path matches the glob pattern
ls -la /var/log/myapp/*.log

# 3. Check the state file for the last rotation date
grep "myapp" /var/lib/logrotate/status

# 4. Verify the timer is running
systemctl status logrotate.timer

Erreurs de Permission Refusee

# Check ownership and permissions of the log file
ls -la /var/log/myapp/app.log

# Check that the logrotate config uses the correct su directive
# Add this inside your config block:
su root adm

L’Espace Disque n’est Pas Libere Apres la Rotation

Si l’espace disque n’est pas libere apres la rotation, une application peut encore maintenir ouvert l’ancien fichier (supprime) :

# Find processes holding deleted files open
sudo lsof +L1 | grep deleted

# Restart the offending service to release the file descriptor
sudo systemctl restart myapp

C’est exactement le scenario ou copytruncate est utile — il tronque le fichier sur place au lieu de le supprimer, de sorte que le descripteur de fichier reste valide.

Corruption du Fichier d’Etat

Si logrotate se comporte de maniere erratique, le fichier d’etat peut etre corrompu :

# Back up the current state file
sudo cp /var/lib/logrotate/status /var/lib/logrotate/status.bak

# Remove the state file (logrotate will recreate it)
sudo rm /var/lib/logrotate/status

# Force a full rotation to rebuild state
sudo logrotate -f /etc/logrotate.conf

Logs Pivotes Mais Non Compresses

Si vous voyez des fichiers .1 non compresses a cote de fichiers .2.gz compresses, c’est le comportement attendu lorsque delaycompress est active. Le fichier le plus recemment pivote reste non compresse pendant un cycle. Si vous avez besoin d’une compression immediate, supprimez la directive delaycompress.

Resume

Logrotate est l’un de ces utilitaires qui travaillent silencieusement en arriere-plan jusqu’a ce que quelque chose tourne mal — et quand ca tourne mal, cela signifie generalement que votre disque est plein. Prendre 15 minutes pour configurer correctement logrotate pour vos applications vous economise des heures de nettoyage de disque en urgence par la suite.

Les points cles a retenir :

  • La configuration globale dans /etc/logrotate.conf definit les valeurs par defaut ; les configurations par application dans /etc/logrotate.d/ les remplacent
  • Utilisez daily avec compress et rotate 14 comme point de depart raisonnable pour la plupart des services
  • Utilisez toujours des scripts postrotate pour signaler aux applications de rouvrir leurs fichiers de log
  • Testez chaque configuration avec logrotate -d avant de la deployer
  • Utilisez copytruncate pour les applications qui ne peuvent pas rouvrir leurs fichiers de log
  • Combinez daily avec maxsize pour les serveurs a fort trafic

Pour securiser le reste de votre serveur, consultez notre Liste de Verification de Securite pour Serveurs Linux : 20 Etapes Essentielles et le Guide Complet du Proxy Inverse Nginx pour configurer Nginx correctement des le depart.