
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/system
mitmylogrotate.config
dem 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/system
Namen 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/system
Namen :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.)