Je travaille sur Ubuntu 14 avec l'utilitaire rsyslog et logrotate par défaut.
Dans la /etc/logrotate.d/rsyslog
configuration par défaut rsyslog logrotate, je vois ce qui suit:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
D'après ce que je comprends, il est recommandé d'utiliser copytruncate dans tous les scénarios logrotate, car il ne déplace pas le journal actuel, mais tronque plutôt le journal afin que tout processus avec un gestionnaire de fichiers ouvert puisse continuer à y écrire.
Alors, comment se fait-il que la configuration par défaut utilise la fonctionnalité de rechargement de rsyslog?
Parlant en tant qu'auteur rsyslog, copytruncate est en fait un très, très, très mauvais choix. Il est intrinsèquement racé et son utilisation est presque une garantie que vous perdrez les données du journal. Plus le fichier est écrit fréquemment, plus vous en perdrez. Et cela ne fait pas seulement partie de la dernière ligne, mais peut être de plusieurs centaines, selon le moment exact et l'état du système au moment de la rotation.
Lorsque le fichier est déplacé et qu'un nouvel inode (fichier) est créé, rsyslog conserve la trace du fichier précédent et termine le traitement. Vous n'avez donc aucune perte dans ce cas. Garanti (sauf si vous démontez le système de fichiers ...).
Sur "reopenOnTruncate": J'ai personnellement vu reopenOnTruncate être aussi racé à d'autres égards, en particulier avec NFS et similaires. Il y a quelque temps, j'ai totalement supprimé cette fonctionnalité, mais j'ai été persuadé plus tard de fusionner des fonctionnalités similaires. Cela restera probablement "expérimental" pour toujours, car je sais vraiment que les gens ont des problèmes sur des systèmes très chargés. "copytruncate" n'est tout simplement pas un mode décent pour travailler avec des fichiers journaux.
Je travaille actuellement sur le refactoring imfile (ETA 8.34 ou 8.35). La version remaniée sera probablement en mesure d'empêcher un renvoi accidentel en raison de la course à l'API, mais ne peut pas non plus se prémunir contre la perte de données, car cela est conceptuellement impossible.
la source
Cela dépend complètement de la façon dont le processus écrit les journaux.
copytruncate
ne fonctionne que si les messages du journal sont ajoutés au fichier (par exemplewhatever >> logfile
.Et pas lorsqu'il redirige la sortie (par exemple
whatever > logfile
).la source
Depuis la version 8.16, rsyslog a une option imfile
reopenOnTruncate
qui gère le problème du copytruncte.la source
Pour rsyslog en particulier, il est probablement plus logique de laisser les choses telles quelles.
La raison fondamentale est que rsyslog a des files d'attente internes qu'il peut utiliser dans les cas où son descripteur de sortie devient indisponible.
Le rechargement a) entraînera rsyslog à recréer son propre fichier journal, et b) provoquera le vidage de tous les événements en file d'attente dans le fichier lors de la création.
Il se peut que la copie tronquée ne nuise pas (même si je crains que des lignes partiellement écrites soient tronquées), mais j'aurais tendance à penser que copier / supprimer / recharger est `` plus sûr '' du point de vue de l'intégrité.
Comme mentionné par @ faker , puisque rsyslog peut gérer la situation où son fichier devient indisponible, il n'y a pas de raison impérieuse d'utiliser copytruncate.
Et comme mentionné par @ SelivanovPavel , rsyslog nécessite en fait une configuration spécifique pour gérer correctement la copie tronquée.
Donc, si seulement parce que l'utilisation de l'
reload
approche nécessite moins d'écart par rapport à la configuration par défaut, je la garderais.la source