Wann wird die Option delaycompress in logrotate verwendet?

33

Die Manpage von logrotatesagt:

It can be used when some program cannot be told to close its logfile
and  thus  might  continue writing to the previous log file for some
time.

Das verwirrt mich. Wenn ein Programm nicht angewiesen werden kann, seine Protokolldatei zu schließen, schreibt es für immer weiter , nicht für eine Weile . Wenn die Komprimierung auf den nächsten Rotationszyklus verschoben wird, schreibt das Programm auch nach dem nächsten Rotationszyklus weiter in diese Datei. Wie verschiebt sich das Problem?

Nach meinem Verständnis copytruncatesollte dies verwendet werden, wenn ein Programm nicht angewiesen werden kann, die Protokolldatei zu schließen. Mir ist bekannt, dass einige in die Protokolldatei geschriebene Daten verloren gehen, wenn der Kopiervorgang ausgeführt wird.

Ich habe in der Logrotate-Datei nach couchdb gesucht, und es gab sowohl Optionen copytruncateals auch delaycompressOptionen.

/usr/local/couchdb-1.0.1/var/log/couchdb/*.log {
   weekly
   rotate 10
   copytruncate
   delaycompress
   compress
   notifempty
   missingok
}

Es sieht so aus, als hätte es keinen Sinn, zu verwenden, delaycompresswenn copytruncatees bereits da ist. Was vermisse ich?

Anand Chitipothu
quelle

Antworten:

27

Ihr Verständnis von copytruncateist korrekt, aber die Formulierung in der Manpage für delaycompressist ein wenig irreführend. Genauer gesagt sollte es sagen, "wenn ein Programm nicht angewiesen werden kann, seine Protokolldatei sofort zu schließen" - zum Beispiel, wenn Sie freigegebene Skripte verwenden und das Skript ein Signal an den Prozess sendet, das das Protokoll verwendet, wenn alle Protokolldateien gedreht wurden .

womble
quelle
1
Wenn ich verwende copytruncate, muss das Programm nicht angewiesen werden, die Protokolldatei zu schließen. Ist es also sinnlos, delaycompresszusammen mit anzugeben copytruncate?
Anand Chitipothu
5
Niemals verwenden, es copytruncatesei denn, Sie müssen unbedingt , weil es Protokolleinträge verliert. Sie können beide Optionen verwenden, wenn Sie die andere Funktion verwenden möchten delaycompress- die Möglichkeit, die vorherige Protokolldatei zu lesen, ohne sie zuerst dekomprimieren zu müssen.
womble
Gibt es eine andere Option, als copytruncatewenn ich meinem Programm nicht mitteilen kann, dass es neu geladen werden soll?
Anand Chitipothu
5
Nein. Aus diesem Grund sollten Sie Software verwenden, die nicht saugt und ein Signal mit der Aufschrift "reload your logs" akzeptiert.
womble
3

Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstehe, aber wenn Sie fragen, was ich denke, verwende ich Folgendes:

postrotate
          killall -HUP syslog-ng
  endscript

Das ist eine nette (oder zumindest eine) Möglichkeit, den Baumstamm zu töten und zum nächsten zu gelangen. Für "Programme", die scheiße sind, wie die ASA-Plattform von Cisco, die Tonnen von Daten pro Sekunde protokolliert, funktioniert es.

Labyrinth
quelle
3

Wir gebrauchen:

  • Täglich
  • delaycompress
  • Knotentext

Dadurch wird eine feste Kopie des Apache erstellt, access_log access_log.1sodass wir am Ende des Tages unser Stats-Paket als Skript ausführen können.

Am folgenden Tag komprimiert logrotate die Dateierstellung access_log.2.zip

Edwardg
quelle