Logrotate#

Pourquoi#

Les journaux vivent sur tmpfs (chapitre Système de fichiers), en RAM bornée, sans rotation : un service bavard finirait par saturer le quota alloué. logrotate gère cette rotation, mais deux services de ce projet ont des besoins particuliers qui débordent du cas générique.

Comment#

nginx#

cat > /etc/logrotate.d/nginx <<'EOF'
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    delaycompress
    compress
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -HUP $(cat /var/run/nginx.pid)
    endscript
}
EOF

chrony#

cat > /etc/logrotate.d/chrony <<'EOF'
/var/log/chrony/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    postrotate
        /usr/bin/chronyc cyclelogs > /dev/null 2>&1 || true
        /usr/bin/chronyc trimlog   > /dev/null 2>&1 || true
    endscript
}
EOF

logrotate -d /etc/logrotate.d/nginx
logrotate -d /etc/logrotate.d/chrony

rotate 14 conserve deux semaines de journaux compressés, une fenêtre raisonnable compte tenu du budget tmpfs de /var/log (256 Mo, chapitre Système de fichiers) : ces journaux sont de toute façon perdus à chaque redémarrage, cette rotation ne vise donc pas un archivage long terme mais simplement un filet de sécurité entre deux reboots. delaycompress retarde d’un cycle la compression du fichier le plus récemment tourné : le processus concerné peut avoir besoin d’un court instant après la rotation pour honorer le signal de postrotate et cesser d’écrire dans l’ancien descripteur ; compresser immédiatement risquerait de corrompre ou de perdre les toutes dernières lignes écrites pendant cette fenêtre.

Erreurs à éviter#

Aucune configuration logrotate.d/audit ne doit être créée. auditd gère sa propre rotation interne via les directives max_log_file et num_logs de auditd.conf. Une rotation externe par logrotate en plus de la rotation interne d’auditd créerait une double gestion des mêmes fichiers, avec un risque réel de corruption de l’état interne du démon d’audit (comportement documenté dans auditd.conf(8)). C’est une exception délibérée, pas un oubli.

  • Oublier le postrotate de nginx. Après rotation, nginx continue d’écrire dans l’ancien fichier (maintenant renommé) tant qu’on ne lui demande pas explicitement de rouvrir ses descripteurs de fichiers : le SIGHUP envoyé au process maître fait exactement cela. Sans lui, les nouveaux logs continueraient silencieusement d’aller dans le fichier compressé/archivé.
  • Oublier chronyc cyclelogs. Chrony a le même besoin que nginx, rouvrir ses fichiers de log après rotation, mais via sa propre commande plutôt qu’un signal Unix générique.

Vérifier#

# Simulation sans exécution réelle (-d = debug/dry-run)
logrotate -d /etc/logrotate.d/nginx
logrotate -d /etc/logrotate.d/chrony

# Forcer une rotation réelle pour test
logrotate -f /etc/logrotate.d/nginx
ls -la /var/log/nginx/
# Doit montrer un fichier .log frais et un .log.1.gz (ou .log.1 avant compression différée)