Protokollrotation mit Komprimierung?

Protokollrotation mit Komprimierung?

Ich führe einen Prozess unter Linux (CentOS 7) aus, der eine Menge Ausgabe auf stdout erzeugt. Wenn ich alles in eine Datei sende, ergibt sich eine Dateigröße von über 1 TB. Aber glücklicherweise ist die Ausgabe ziemlich komprimierbar – sie besteht aus viel sich ziemlich wiederholendem Text.

Meine Frage ist nun, ob ich eine Art Protokollrotationsprogramm verwenden kann, wie die hier beschriebenen: (Protokollrotation von stdout?), aber wenn ein Protokoll nicht mehr aktuell ist, wird es komprimiert (und nie gelöscht)? Ich schreibe also beispielsweise ein paar GB in die Datei, komprimiere sie und schreibe weiter in eine neue Datei?

Antwort1

Sie könnenlogrotatedafür. CentOS 7 verwendetsystemdSo können Sie konfigurieren eineGeplante Logrotate-Aufgabemit so etwas wie diesem:

  • Erstellen Sie eine Logrotate-Konfigurationsdatei /etc/systemd/systemmit mylogrotate.configdem folgenden Inhalt:

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

Dadurch wird logrotate angewiesen, Folgendes zu tun:

  • Ältere 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 Sie über zwei unkomprimierte Protokolldateien verfügen.
  • Protokolldateien werden rotiert, wenn sie größer als 1 GB werden.
  • Sollte die Logdatei fehlen, wird ohne Fehlermeldung mit der nächsten fortgefahren.
  • Senden Sie keine alten Protokolldateien an beliebige Adressen.
  • Protokolldateien werden 30 Mal rotiert, bevor sie gelöscht werden. Sie haben also 30 alte Protokolldateien. Alle Dateien, die älter sind, werden gelöscht.

Erstellen Sie einen systemd-Dienst. Erstellen Sie eine Datei mit dem folgenden /etc/systemd/systemNamen 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 folgendem /etc/systemd/systemNamen :mylogrotate.timer

[Unit]
Description=Rotate My Log Timer

[Timer]
OnCalendar=*:00:00
Persistent=true

[Install]
WantedBy=timers.target

Dadurch wird logrotate stündlich ausgeführt.

Alles ist eingerichtet. Aktivieren Sie nun die geplante Aufgabe.

systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer

Führen Sie dies alles natürlich als Root aus.

(Ich verwende Ubuntu, hoffe aber, dass dies auch unter CentOS problemlos funktioniert.)

verwandte Informationen