Logrotate

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Rotation des fichiers de logs
Commande logrotate
Config globale /etc/logrotate.conf
Config par service /etc/logrotate.d/
Tester une règle logrotate -d /etc/logrotate.d/<fichier>
Voir aussi Crontab (déclenchement périodique)

logrotate gère la rotation, la compression et la purge des fichiers de logs pour éviter qu'ils ne saturent le disque. Il est piloté par un fichier de configuration global et par des règles spécifiques déposées par chaque service dans /etc/logrotate.d/, et est généralement invoqué périodiquement via cron ou son timer systemd équivalent.

Commandes de base

logrotate /etc/logrotate.conf                                          # exécution normale (respecte l'état déjà enregistré)
logrotate -f /etc/logrotate.conf                                       # forcer la rotation de toutes les règles, même si la fréquence n'est pas atteinte
logrotate -d /etc/logrotate.d/nginx                                    # mode debug (dry-run) : simule sans rien écrire, affiche ce qui serait fait
logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf   # spécifier un autre fichier d'état que celui par défaut

logrotate conserve la date de dernière rotation de chaque fichier dans un fichier d'état (souvent /var/lib/logrotate/logrotate.status, parfois /var/lib/logrotate.status selon la distribution) — c'est ce qui lui évite de re-rotater un fichier déjà traité si la commande est relancée plusieurs fois le même jour. -f force la rotation en ignorant cet état, -d simule sans rien modifier ni écrire dans le fichier d'état : les deux sont utiles pour tester une règle avant de la mettre en production.

Fichiers de configuration

/etc/logrotate.conf contient les réglages par défaut (fréquence, nombre d'archives conservées, options communes) ainsi qu'une directive include /etc/logrotate.d qui charge tous les fichiers de ce répertoire. Chaque service installé (nginx, postfix, yum, une application maison…) dépose sa propre règle dans /etc/logrotate.d/<nom> : ces fichiers spécifiques héritent des réglages globaux et peuvent les surcharger localement.

cat /etc/logrotate.conf     # réglages par défaut + include /etc/logrotate.d
cat /etc/logrotate.d/nginx  # règle spécifique à un service

Syntaxe d'une règle

/var/log/monappli/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 monappli monappli
    sharedscripts
    postrotate
        systemctl reload monappli >/dev/null 2>&1 || true
    endscript
}

Directives les plus courantes :

  • daily / weekly / monthly — fréquence de rotation
  • rotate N — nombre d'archives conservées avant suppression de la plus ancienne
  • size 1k — déclenche une rotation dès que le fichier dépasse cette taille, indépendamment de la fréquence
  • compress / delaycompress — compresse les archives ; delaycompress retarde la compression d'un cycle, le temps qu'un process encore ouvert sur l'ancien fichier finisse d'écrire
  • missingok — n'inscrit pas d'erreur si le fichier de log est absent
  • notifempty — ne fait pas tourner un fichier vide
  • create MODE USER GROUP — recrée un fichier vide avec ces permissions juste après la rotation
  • copytruncate — copie le fichier puis le vide sur place au lieu de le renommer, utile quand le process qui écrit dedans ne peut pas rouvrir son descripteur de fichier
  • dateext — ajoute la date dans le nom du fichier archivé plutôt qu'un simple numéro
  • maxage N — âge maximum en jours des archives avant suppression, en complément de rotate
  • mail adresse — envoie l'archive tournée par mail avant de la traiter
  • sharedscripts — exécute prerotate/postrotate une seule fois pour tout le bloc (utile avec un glob comme *.log) plutôt qu'une fois par fichier correspondant
  • postrotate ... endscript — bloc de commandes exécuté après la rotation, typiquement pour recharger le service afin qu'il rouvre son fichier de log

Exemple complet

cat > /etc/logrotate.d/monappli << 'EOF'
/var/log/monappli/*.log {
    daily
    rotate 5
    compress
    delaycompress
    missingok
    notifempty
    create 0640 monappli monappli
    sharedscripts
    postrotate
        systemctl reload monappli >/dev/null 2>&1 || true
    endscript
}
EOF

Voir aussi

  • Crontab — logrotate est généralement déclenché de façon périodique via cron