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
grepetawkdeviennent 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 :
-
Un timer systemd declenche logrotate quotidiennement — Sur les systemes Ubuntu modernes, l’unite
logrotate.timerexecutelogrotate.serviceune fois par jour. Sur les systemes plus anciens, une tache cron dans/etc/cron.daily/logrotates’en chargeait. -
Logrotate lit sa configuration — Il charge
/etc/logrotate.conf(la configuration globale), qui inclut tous les fichiers sous/etc/logrotate.d/. -
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.
-
La rotation s’effectue — Le fichier de log actuel est renomme (par exemple,
access.logdevientaccess.log.1), et un nouveau fichier vide est cree. Les fichiers pivotes precedents sont renumerotes (access.log.1devientaccess.log.2, etc.). -
La compression s’execute — Les fichiers pivotes sont compresses (generalement avec gzip), avec
delaycompressqui attend un cycle avant de compresser. -
Les scripts de post-rotation s’executent — Les commandes a l’interieur des blocs
postrotate/endscripts’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.logdu repertoire de logs Nginxdaily— Effectue la rotation chaque jour (remplace leweeklyglobal)rotate 14— Conserve deux semaines de logs pivotesdelaycompress— Ne compresse pas le log d’hier immediatement ; cela permet aux outils d’analyse de le traiter d’abordcreate 0640 www-data adm— Le nouveau fichier de log appartiendra awww-dataavec le groupeadm, et les permissions0640sharedscripts— Execute le script postrotate une seule fois, meme si plusieurs fichiers de log correspondent au motif globpostrotate— Envoie le signalUSR1a Nginx, qui lui indique de rouvrir ses fichiers de log sans redemarrer
Important : Le signal
USR1est 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 :
-
copytruncatevscreate— Si votre application ne peut pas rouvrir ses fichiers de log (de nombreuses applications Node.js et Python gardent le descripteur de fichier ouvert), utilisezcopytruncate. 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 30avecmaxage 90— Conserve 30 fichiers pivotes, mais supprime egalement tout ce qui a plus de 90 jours. La directivemaxagefournit un filet de securite. -
dateext— Utilise des noms bases sur la date commeapp.log-20260114.gzau lieu de noms numeriques commeapp.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
|| trueou; truepour empecher les echecs de script d’arreter logrotate - Utilisez
sharedscriptslorsque 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 :
sizeremplace entierement la rotation basee sur le temps — logrotate ne verifie que la taille du fichiermaxsizefonctionne conjointement avec la rotation basee sur le temps — pivote selon le calendrier OU lorsque la taille est depassee, selon ce qui survient en premierminsizeempeche 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
| Directive | Description | Exemple |
|---|---|---|
daily | Pivote les fichiers de log chaque jour | daily |
weekly | Pivote les fichiers de log une fois par semaine | weekly |
monthly | Pivote les fichiers de log une fois par mois | monthly |
rotate N | Conserve N fichiers pivotes avant suppression | rotate 7 |
compress | Compresse les fichiers pivotes avec gzip | compress |
delaycompress | Retarde la compression d’un cycle de rotation | delaycompress |
missingok | Ne genere pas d’erreur si le fichier de log est absent | missingok |
notifempty | Ne pivote pas si le fichier de log est vide | notifempty |
create mode owner group | Cree un nouveau fichier de log avec les attributs specifies | create 0640 www-data adm |
copytruncate | Copie le log puis tronque l’original | copytruncate |
size N | Pivote lorsque le fichier depasse N octets/Ko/Mo | size 100M |
maxsize N | Pivote selon le calendrier ou lorsque la taille depasse N | maxsize 500M |
minsize N | Ne pivote que si le fichier fait au moins N | minsize 1M |
maxage N | Supprime les fichiers pivotes de plus de N jours | maxage 90 |
dateext | Utilise des suffixes bases sur la date pour les fichiers pivotes | dateext |
sharedscripts | Execute les scripts postrotate une seule fois pour tous les fichiers correspondants | sharedscripts |
postrotate/endscript | Commandes shell a executer apres la rotation | Voir les exemples ci-dessus |
prerotate/endscript | Commandes shell a executer avant la rotation | Voir les exemples ci-dessus |
olddir /chemin | Deplace les fichiers pivotes vers un autre repertoire | olddir /var/log/archive |
su user group | Execute la rotation en tant qu’utilisateur et groupe specifiques | su 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.confdefinit les valeurs par defaut ; les configurations par application dans/etc/logrotate.d/les remplacent - Utilisez
dailyaveccompressetrotate 14comme point de depart raisonnable pour la plupart des services - Utilisez toujours des scripts
postrotatepour signaler aux applications de rouvrir leurs fichiers de log - Testez chaque configuration avec
logrotate -davant de la deployer - Utilisez
copytruncatepour les applications qui ne peuvent pas rouvrir leurs fichiers de log - Combinez
dailyavecmaxsizepour 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.