Rotation mit Kompression protokollieren?

617
LangeHaare

Ich führe einen Prozess unter Linux (CentOS 7) aus, der auf stdout viel ausgibt. Wenn Sie alle Dateien an eine Datei senden, wird die Dateigröße größer als 1 TB. Glücklicherweise ist die Ausgabe ziemlich komprimierbar - sie besteht aus einer Menge recht wiederholter Texte.

Mein Gedanke ist, kann ich ein Protokoll-Rotationsprogramm wie das hier beschriebene verwenden: ( Protokollrotation von stdout? ), Aber wenn ein Protokoll nicht mehr aktuell ist, wird es komprimiert (und niemals gelöscht). Am Ende schreibe ich also ein paar GB in die Datei, komprimiere sie und schreibe weiter in eine neue Datei?

1
Was ist eine Version von Linux, da Linux nur ein Kernel ist, wie lautet der Name Ihres Verteilungselements? Viele von ihnen haben bereits das, was Sie brauchen Alex vor 5 Jahren 0
@Alex ist CentOS 7 LangeHaare vor 5 Jahren 0
Du meinst wie mit logrotate? Ignacio Vazquez-Abrams vor 5 Jahren 0
Ich habe ein Problem untersucht, auf das Sie möglicherweise stoßen. Siehe [* Ist die Umleitung mit `>>` äquivalent zu `>`, wenn die Zieldatei noch nicht existiert? *] (Https://superuser.com/q/1342489/432690) Kamil Maciorowski vor 5 Jahren 1

1 Antwort auf die Frage

5
bcs78

Sie können dafür Logrotate verwenden . CentOS 7 verwendet systemd, sodass Sie eine geplante Logrotate-Task wie folgt konfigurieren können :

  • Erstellen Sie eine logrotate Konfigurationsdatei in /etc/systemd/systemnamens mylogrotate.configmit folgendem Inhalt:

    /path/to/your/logfile/*.log { compress copytruncate delaycompress minsize 1G missingok nomail notifempty rotate 30 } 

Dies sagt logrotate, dass es folgendes tun soll:

  • Alte Versionen von Protokolldateien werden standardmäßig mit gzip komprimiert.
  • Kürzen Sie die ursprüngliche Protokolldatei an Ort und Stelle, nachdem Sie eine Kopie erstellt haben, anstatt die alte Protokolldatei zu verschieben und optional eine neue zu erstellen.
  • Verschieben Sie die Komprimierung der vorherigen Protokolldatei auf den nächsten Rotationszyklus, sodass zwei unkomprimierte Protokolldateien zur Verfügung stehen.
  • Protokolldateien werden gedreht, wenn sie größer als 1 GB sind.
  • Wenn die Protokolldatei fehlt, fahren Sie mit der nächsten fort, ohne eine Fehlermeldung auszugeben.
  • Versenden Sie alte Protokolldateien nicht an eine Adresse.
  • Protokolldateien werden vor dem Entfernen 30 Mal gedreht, sodass Sie 30 alte Protokolldateien haben. Alles was älter ist, wird gelöscht.

Erstellen Sie einen systemd-Dienst. Erstellen Sie eine Datei mit dem folgenden /etc/systemd/systemAufruf mylogrotate.service:

[Unit] Description=Rotate My Log  [Service] Type=oneshot ExecStart=/usr/sbin/logrotate /etc/systemd/system/mylogrotate.config --state /etc/systemd/system/mylogrotate.state --verbose 

Lassen Sie uns diese Aufgabe planen. Erstellen Sie eine dritte Datei mit dem folgenden /etc/systemd/systemAufruf mylogrotate.timer:

[Unit] Description=Rotate My Log Timer  [Timer] OnCalendar=*:00:00 Persistent=true  [Install] WantedBy=timers.target 

Dies wird jede Stunde logrotiert.

Alles ist eingerichtet. Aktivieren Sie jetzt die geplante Aufgabe.

systemctl enable mylogrotate.timer systemctl start mylogrotate.timer 

Natürlich tun Sie das alles als root.

(Ich bin auf Ubuntu, aber ich hoffe, dass dies ohne Probleme mit CentOS funktioniert.)

`copytruncate` scheint nützlich zu sein, aber ich denke, es wird funktionieren, wenn die Umleitung in die Protokolldatei mit` >> `erfolgt. erst dann, wenn die Datei abgeschnitten wird, erscheint der neue Inhalt von Anfang an. Bei der Umleitung mit> bleibt der (wachsende) Offset erhalten, so dass alle neuen Daten nach dem Abschneiden der Datei dazu führen, dass die Datei (mit führenden Nullen) auf die alte Größe anwächst. Kamil Maciorowski vor 5 Jahren 1