Ich arbeite an Ubuntu 14 mit dem Standard-Dienstprogramm rsyslog und logrotate.
In der Standardkonfiguration von rsyslog logrotate /etc/logrotate.d/rsyslog
sehe ich Folgendes:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
reload rsyslog >/dev/null 2>&1 || true
endscript
}
Soweit ich weiß, wird empfohlen, copytruncate in allen Logrotate-Szenarien zu verwenden, da es nicht das aktuelle Protokoll verschiebt, sondern das Protokoll abschneidet, damit jeder Prozess mit einem geöffneten Datei-Handler weiterhin darauf schreiben kann.
Wie kommt es also, dass die Standardkonfiguration stattdessen die Funktion zum erneuten Laden von rsyslog verwendet?
Copytruncate ist als rsyslog-Autor eine sehr, sehr, sehr schlechte Wahl. Es ist von Natur aus rassig und die Verwendung ist fast eine Garantie dafür, dass Sie Protokolldaten verlieren. Je öfter in die Datei geschrieben wird, desto mehr verlieren Sie. Und dies ist nicht nur ein Teil der letzten Zeile, sondern kann mehrere hundert betragen, abhängig vom genauen Zeitpunkt und Zustand des Systems zum Zeitpunkt der Rotation.
Wenn die Datei verschoben und eine neue Inode (Datei) erstellt wird, verfolgt rsyslog die vorherige Datei und schließt die Verarbeitung ab. Sie haben also in diesem Fall keinen Verlust. Garantiert (außer wenn Sie das Dateisystem aushängen ...).
Zu "reopenOnTruncate": Ich persönlich habe gesehen, dass reopenOnTruncate auch in anderer Hinsicht rassig ist, insbesondere bei NFS und ähnlichem. Vor einiger Zeit habe ich diese Funktionalität vollständig entfernt, wurde aber später dazu überredet, ähnliche Funktionen wieder zusammenzuführen. Es wird höchstwahrscheinlich für immer "experimentell" bleiben, da ich wirklich weiß, dass Menschen auf sehr stark ausgelasteten Systemen auf Probleme stoßen. "copytruncate" ist einfach kein anständiger Modus, um mit Protokolldateien zu arbeiten.
Ich arbeite derzeit am Refactoring von imfile (ETA 8.34 oder 8.35). Die überarbeitete Version wird wahrscheinlich in der Lage sein, ein versehentliches erneutes Senden aufgrund eines API-Rennens zu verhindern, kann aber auch nicht vor Datenverlust schützen - da dies konzeptionell unmöglich ist.
quelle
Dies hängt vollständig davon ab, wie der Prozess Protokolle schreibt.
copytruncate
funktioniert nur, wenn die Logmeldungen an die Datei angehängt werden (zwhatever >> logfile
. B.und nicht, wenn die Ausgabe umgeleitet wird (z
whatever > logfile
. B. ).quelle
Seit Version 8.16 verfügt rsyslog über die Option imfile
reopenOnTruncate
, die das Problem copytruncte behandelt.quelle
Für rsyslog ist es wahrscheinlich sinnvoller, die Dinge so zu belassen, wie sie sind.
Der Grund dafür ist, dass rsyslog interne Warteschlangen hat, die in Fällen verwendet werden können, in denen das Ausgabe-Handle nicht mehr verfügbar ist.
Durch das Neuladen wird a) veranlasst, dass rsyslog seine eigene Protokolldatei neu erstellt, und b) dass alle Ereignisse in der Warteschlange bei der Erstellung in die Datei geschrieben werden.
Es kann sein, dass copytruncate keinen Schaden anrichtet (obwohl ich besorgt darüber wäre, dass teilweise geschriebene Zeilen abgeschnitten werden), aber ich würde eher denken, dass copy / delete / reload unter dem Gesichtspunkt der Integrität "sicherer" ist.
Wie von @ faker erwähnt , gibt es keinen zwingenden Grund für die Verwendung von copytruncate, da rsyslog die Situation bewältigen kann, in der seine Datei nicht mehr verfügbar ist.
Und wie von @ SelivanovPavel erwähnt , benötigt rsyslog tatsächlich eine spezielle Konfiguration, um das Abschneiden von Kopien richtig zu handhaben.
Wenn die Verwendung des
reload
Ansatzes nur eine geringere Abweichung von der Standardkonfiguration erfordert, würde ich ihn beibehalten.quelle