Ich habe ein einfaches Skript, das eine Reihe von Protokollen auf dem Bildschirm ausgibt, und ich habe das STDOUT in eine Datei umgeleitet, um die Protokolle zu speichern. Da dieses Skript lange ausgeführt wird, musste ich die Protokolldateien drehen, damit sie in kleinere, besser verwaltbare Dateien umgewandelt werden können.
Das Problem, mit dem ich konfrontiert war, war, dass, sobald die logrotate
aktuelle Protokolldatei in eine neue verschoben wird, die neu erstellte Protokolldatei nicht mehr mit den Protokollen gefüllt wird. Es scheint, dass die Dateihandhabung nach dem Entfernen der ursprünglichen Protokolldatei verloren geht und die Umleitung nicht mehr funktioniert.
Ich habe auch diesen Beitrag gefunden, der das gleiche Problem hatte wie ich und behauptet, dass es behoben werden kann, indem man die Ausgabe umleitet , >>
anstatt >
. Ich habe seine Lösung getestet, aber es hat bei mir nicht funktioniert. Hat jemand eine Idee, wie man die Umleitungsarbeit behält?
Antworten:
Sie sollten die copytruncate-Direktive in Ihrer logrotate-Konfiguration für diese Protokolldatei verwenden.
quelle
compress
Operation werden die Daten dupliziert. Das hat uns einmal Probleme bereitet, aber das war schlecht, denn wir hätten nicht so nahe amlv
Platzlimit sein sollen. Wie imman
Snippet angegeben, gehen möglicherweise einige Protokolldaten zwischen den Kopier- und Kürzungsvorgängen verloren.Alternativ können Sie auch:
Verwenden Sie das Logger-Dienstprogramm in Ihrem Skript anstelle von Piping, und verwenden Sie dafür eine spezielle Funktion (z. B. local5). Beispiel:
logger -p local5.info -t myscriptname "this is some log data"
Konfigurieren Sie syslog so, dass diese Funktion in die gewünschte Protokolldatei geschrieben wird, Beispiel (rsyslog.conf):
local5.* /var/log/mylogfile
Logrotate-Regel für dieses Protokoll einrichten.
quelle
echo
. Die Ausgabe von Tools von Drittanbietern, die vom Skript aufgerufen werden und auch etwas ausgeben, kann auf diese Weise nicht an den Logger umgeleitet werdenEine andere Alternative zur Iain-Lösung besteht darin, ein
postrotate
Skript zu verwenden, um Ihr Skript neu zu starten, sobald die Rotation stattgefunden hat. Dies geschieht für viele Daemons (den Daemon neu starten oder neu laden), ohne Ihr Skript zu kennen. Ich weiß nicht, ob diese Lösung für Sie geeignet ist oder nicht (hängt Ihr Skript von einem Zustand ab, der vor einiger Zeit generiert wurde?).Inhalt von
/etc/logrotate.d/your-script-name
:quelle
Sie können stdout auf "split" leiten (Teil von coreutils in Linux). Sie können die Datei / stdin nach Größe, Anzahl der Zeilen usw. in Blöcke aufteilen. Sobald Sie einen Block erstellt haben, können Sie ihn bei Bedarf mit logrotate verwalten.
quelle