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
}
EOFchrony#
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/chronyrotate 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/auditne doit être créée.auditdgère sa propre rotation interne via les directivesmax_log_fileetnum_logsdeauditd.conf. Une rotation externe parlogrotateen 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é dansauditd.conf(8)). C’est une exception délibérée, pas un oubli.
- Oublier le
postrotatede 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 : leSIGHUPenvoyé 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)