Ein VPN-Watchdog-Log rotieren, ohne den Schreiber zu brechen
Klären Sie zuerst das Ziel, und passen Sie dann die Rotation daran an, wie der Schreiber die Datei öffnet: Umbenennen für kurze Prüfungen, erneutes Öffnen oder copytruncate für einen Daemon.
Eine VPN-Zustandsprüfung, die jede Minute eine Zeile anhängt, schafft still eine zweite Aufgabe: zu entscheiden, wie diese Zeilen die Platte verlassen. Das Reparieren des Tunnels ändert nichts an dieser Aufgabe, und das Umbenennen der Datei leitet einen Prozess nicht um, der noch den alten Deskriptor hält. Beantworten Sie zuerst die Frage nach dem Ziel, und passen Sie dann die Rotation daran an, wie der Schreiber die Datei öffnet.
Wählen Sie das Ziel vor der Rotationsrichtlinie
Eine systemd-Unit, die ihre Ausgabe bereits an das Journal sendet, hält die Aufbewahrung an einer Stelle. journald erzwingt Grenzen wie SystemMaxUse und MaxRetentionSec , sodass ein Watchdog, der dort protokolliert, eine Grenze ohne Mehraufwand erbt. Eine zweite unbegrenzte Datei daneben zu legen, verdoppelt die Wartung ohne Gewinn.
Eine dedizierte Datei verdient ihren Platz, wenn etwas anderes sie liest: ein Parser, ein Audit-Export oder eine Seite, die einen stabilen Pfad erwartet. Ist diese Entscheidung gefallen, braucht die Datei einen Eigentümer, einen Modus und eine Rotationsrichtlinie, die zusammen niedergeschrieben werden, denn die drei sind nur als Satz korrekt. Ein Pfad, den jeder anlegen kann, ist auch ein Pfad, den jeder ersetzen kann, also gehören die Verzeichnisrechte in dieselbe Notiz. Schreiben Sie das alles neben die Prüfung, und die nächste Änderung beginnt mit denselben Fakten.
Schreiben Sie den Block passend zum Schreiber
Gehen Sie von einem Schreiber aus, der den Pfad bei jedem Aufruf öffnet, eine Zeile anhängt und sich beendet. Dieses Muster übersteht die Rotation ohne jede Mitarbeit des Prozesses, weil der nächste Lauf die Datei öffnet, die gerade an diesem Pfad liegt. Der folgende Block behält eine Woche von Versionen und legt die Datei mit dem Eigentümer und dem Modus neu an, die der Schreiber braucht:
/var/log/vpn-watchdog.log {
daily
rotate 7
create 0600 root root
missingok
notifempty
}
Die logrotate-Handbuchseite definiert die Anzahl als die Zahl der aufbewahrten rotierten Versionen, nicht als garantierte sieben Tage Historie, und das Schlüsselwort daily wird beim Ausführen des Jobs ausgewertet, statt als eigener Scheduler zu wirken. Auf den meisten Distributionen besitzt bereits ein systemd-Timer oder ein Cron-Eintrag diesen Aufruf, prüfen Sie also, welcher existiert, bevor Sie einen zweiten hinzufügen. Die Eigentümerschaft richtig zu treffen, ist wichtiger als die Aufbewahrungszahl. Einen Nur-root-Modus auf eine Datei zu kopieren, die ein Dienstkonto schreibt, stoppt die Protokollierung bei der nächsten Rotation, und der Fehler erscheint Stunden später als veralteter Zeitstempel statt als Fehler. Bestätigen Sie den Benutzer des Schreibers, bevor Sie einen Block von woanders kopieren.
Ein Schreiber, der nie erneut öffnet, braucht eine andere Lösung
Ein langlaufender Prozess mit einem offenen Deskriptor schreibt weiter in den umbenannten Inode. Speicher wird nicht freigegeben, und die sichtbare Datei wächst nicht mehr, was wie eine kaputte Rotation aussieht, bis Sie den Inode prüfen. Bringen Sie dem Prozess entweder das erneute Öffnen bei, oder lassen Sie die Rotation kopieren und abschneiden statt umbenennen.
Der Weg des erneuten Öffnens ist der sauberere, wo die Software ihn unterstützt: Senden Sie das dokumentierte Signal oder führen Sie den dokumentierten Befehl aus, und lassen Sie den Prozess die neue Datei selbst öffnen. Die Alternative ist copytruncate , das den Inhalt unter den rotierten Namen kopiert und dann das Original an Ort und Stelle abschneidet, sodass der Deskriptor gültig bleibt, aber Schreibvorgänge zwischen Kopie und Abschneiden verloren gehen.
Richten Sie bei Units, die von systemd gestartet werden, StandardOutput auf das Journal oder auf eine Datei, und lassen Sie die Unit den Lebenszyklus besitzen. Eine Shell-Schleife, die über tee -a ohne Größengrenze anhängt, ist die Anordnung, die während einer Störung eine Partition füllt, weil eine fehlschlagende Prüfung oft weit mehr protokolliert als eine gesunde.
Testen Sie die Rotation, ohne auf den Timer zu warten
Der Debug-Modus meldet, was passieren würde, und berührt nichts, was ihn zum sicheren ersten Lauf nach einer Änderung macht. Erzwingen Sie eine echte Rotation, wenn Sie zufrieden sind, und bestätigen Sie dann, dass die nächste Logzeile in der neuen Datei landet und nicht in der umbenannten:
logrotate -d /etc/logrotate.d/vpn-watchdog logrotate -f /etc/logrotate.d/vpn-watchdog ls -l /var/log/vpn-watchdog.log* tail -n 3 /var/log/vpn-watchdog.log df -h /var/log
Lesen Sie die Ausgabe in dieser Reihenfolge. Der Debug-Lauf sollte die Datei und die beabsichtigten Aktionen nennen; ein erzwungener Lauf sollte den erwarteten rotierten Namen erzeugen; tail sollte nach dem nächsten Lauf des Schreibers einen frischen Eintrag zeigen. Ein wachsender df-Wert bei einer schrumpfenden sichtbaren Datei bedeutet das oben beschriebene Deskriptorproblem.
Wiederholen Sie den erzwungenen Lauf zweimal, um zu sehen, wie sich die Aufbewahrung verhält, wenn bereits Versionen existieren. Das Löschen der ältesten Datei ist das erwartete Ergebnis, und ein fehlendes Löschen bedeutet meist, dass die Anzahl oder das Platzhalterzeichen im rotierten Namen nicht zu dem passt, was logrotate erzeugt hat.
Behalten Sie einen Rollback und eine schriftliche Aufzeichnung
Sichern Sie den vorherigen Block vor dem Bearbeiten und notieren Sie, welcher Scheduler ihn ausführt, denn ein Rollback, der die Datei, aber nicht den Timer wiederherstellt, reproduziert die Hälfte des ursprünglichen Problems. Rotieren Sie nach dem Wiederherstellen einmal von Hand, und bestätigen Sie dann, dass das Konto des Schreibers den Logpfad beschreiben kann. Läuft der Dienst unter systemd, laden Sie die Unit nach jeder Änderung ihrer Ausgabeumleitung neu, da der laufende Prozess weiter in das alte Ziel schreibt. Lesen Sie die nächsten paar Logzeilen selbst, statt darauf zu vertrauen, dass die Unit sauber zurückkam.
Halten Sie Modus, Eigentümer, Aufbewahrungszahl und das erwartete Speicherbudget neben der Prüfung selbst fest. Wenn die Prüfung später von einem Einmalskript zu einem Daemon wird, muss sich die Rotationsrichtlinie mit ihr ändern, und diese Notiz sagt der nächsten Person, welche Annahme gebrochen ist.
Schließlich halten Sie die Log-Entscheidung von der Wiederherstellungsentscheidung getrennt. Eine fehlgeschlagene Probe sollte der eigenen Wiederherstellungsrichtlinie der Verbindung folgen, nicht einer in logrotate versteckten Regel, und keine Protokollierungsanordnung sollte der Grund sein, einen funktionierenden Tunnel neu zu starten.