Ändern der Standardmethode von LogRotate zum Rotieren der Protokolldateien

Ändern der Standardmethode von LogRotate zum Rotieren der Protokolldateien

Meine Beobachtung bei der Logrotation ist, dass zum Rotieren einer beliebigen Logdatei der Logrotate-Prozess in der folgenden Reihenfolge durchgeführt wird

  1. kopiert die betreffende Protokolldatei (nennen wir sie file1.log) unter einem neuen Namen (indem dem bestehenden Namen ein Zeitstempel oder eine Nummer hinzugefügt wird, sodass sie zu file1.log-20140513 wird),
  2. löscht die vorhandene Datei (file1.log) und erstellt eine neue leere Protokolldatei mit dem ursprünglichen Namen (file1.log),
  3. komprimiert die rotierte Datei (file1.log-20140513), wodurch eine neue komprimierte Datei (file1.log-20140513.gz) erstellt wird, wenn die Komprimierungsoption gesetzt ist,
  4. löscht die rotierte Datei (file1.log-20140513) und schließlich
  5. Gehen Sie zur nächsten Datei und führen Sie dort die gleichen 4 Schritte wie oben aus.

Bei diesem Vorgang tritt bei mir folgendes Problem auf:

  1. Meine Protokolldateien haben eine riesige Größe (jeweils über 10 GB) und ich habe ungefähr 42 solcher Protokolldateien.
  2. Die Prozesse, die in diese Dateien schreiben, arbeiten synchron,
  3. Der DiskIO auf dem Server ist gut, aber das Kopieren dauert trotzdem seine Zeit, und das Komprimieren dauert ebenfalls seine Zeit, und die Komprimierung verbraucht auch CPU.
  4. Ich möchte, dass alle neu erstellten Protokolldateien Protokolle ab derselben Zeit enthalten.

Dazu möchte ich, dass logrotate die Dateien verschiebt, was auch der Befehl mv tut, der die Dateien umbenennt, anstatt sie zu kopieren. Was die Komprimierung betrifft, kann ich diese deaktivieren und über ein anderes Skript auslösen, das über cron geplant wird. Aber ich möchte, dass logrotate die Dateien verschiebt, anstatt sie zu kopieren.

Ich bin mir sicher, dass die Autoren von logrotate sich das auch gedacht hätten, da es offensichtlich Festplatten-E/A und die zum Abschließen des gesamten logrotate-Vorgangs benötigte Zeit spart. Daher möchte ich wissen, warum Dateien kopiert und nicht verschoben oder umbenannt werden und wie ich dies über logrotate erreiche.

HINWEIS: Ich habe versucht, es manuell zu machen, d. h., ich habe die Datei verschoben, in die ein laufender Prozess geschrieben hat, und eine neue leere Datei mit demselben Namen und denselben Berechtigungen erstellt (das ist root, was auch die Berechtigung ist, mit der der Prozess läuft), aber nachdem ich eine neue Datei verschoben und erstellt hatte, sah ich, dass der Prozess nichts hineinschrieb, also musste ich den Prozess neu starten, damit er in diese Datei schreibt. Kann mir jemand auch dieses Verhalten erklären, warum logrotate es schafft, den Prozess dazu zu bringen, in dieselbe Datei zu schreiben, ich es aber mit den einfachen Schritten nicht schaffe.

Antwort1

Das von Ihnen beschriebene Verhalten tritt nur auf, wenn logrotate durch die copytruncateDirektive ausdrücklich dazu aufgefordert wurde. Die Dokumentation warnt vor der Möglichkeit, dass durch dieses Verhalten einige Protokolldaten verloren gehen. Diese Direktive sollte nur als letztes Mittel verwendet werden.

Die Standardmethode zum Rotieren von Protokolldateien besteht darin, sie umzubenennen und dann ein Signal an den Prozess zu senden, damit dieser die neue Protokolldatei öffnet. Dies ist schneller und birgt nicht das Risiko, dass Teile des Protokolls verloren gehen. Allerdings muss der Schreibvorgang in der Lage sein, zu einer neuen Protokolldatei zu wechseln.

Die Komprimierung kann ausgeschaltet oder bis zur nächsten Rotation verschoben werden. Wird die compressDirektive verwendet, werden die alten Logdateien komprimiert. Wird die Direktive nicht verwendet, werden sie nicht komprimiert.

Wenn sowohl compressals auch delaycompressverwendet werden, wird die Komprimierung bis zur nächsten Rotation verzögert. Auf diese Weise sind nach jeder Rotation die beiden neuesten Protokolldateien noch nicht komprimiert.

Antwort2

Nachdem ich eine neue Datei verschoben und erstellt hatte, sah ich, dass der Prozess nichts in die Datei schrieb. Also musste ich den Prozess neu starten, damit er in die Datei schrieb

Der Prozess schreibt in dieselbe Datei, deshalb wird die Protokollrate kopiert, anstatt verschoben. Wenn Sie das Protokoll löschen, schreibt der Prozess immer noch in das Protokoll und Sie können sehen, dass die Dateisystemnutzung zunimmt, aber keine Datei. Ein Neustart des Prozesses gibt Speicherplatz frei.

überlege zu

verwandte Informationen