Rotierende Protokolle, die von einem Prozess generiert wurden, der sich bei stdin anmeldet

7

Ich habe einen lang laufenden Prozess, der seine Protokolldatei schreibt stdout. Ich möchte diese Ausgabe in verschiedenen Dateien speichern, diese Dateien automatisch verwalten (wie das Löschen / Archivieren der alten), ohne den Hauptprozess neu zu starten.

Eine Lösung wäre, die Ausgabe an eine Datei ( process > log.txt) zu senden und darauf zu verwenden logrotate, muss aber logrotatedas Programm neu starten, was nicht möglich ist.

Die andere Möglichkeit besteht darin, die Ausgabe an cronolog( process | cronolog) weiterzuleiten. In diesem Fall werden ältere Dateien jedoch nicht gelöscht / archiviert, sodass ich ein Programm erstellen muss, das die Wartung für mich übernimmt.

Das Beste wäre, beide Dienstprogramme verwenden zu können, da cronologich den Prozess nicht neu starten muss und logrotatedie alten Protokolldateien genau so pflegen werde, wie ich es möchte. Gibt es eine Möglichkeit, diese beiden Programme miteinander zu arbeiten? Wenn nicht, was ist eine gute Lösung für dieses Problem?

SztupY
quelle
1
Dieser serverfault.com/questions/189477/… beantwortet wahrscheinlich Ihre Frage
user9517
systemd und das Journal sollten dies beheben können, wenn sie in der Produktion verfügbar sind. systemd leitet stdoutzum Journal um und das Journal dreht die Protokolle bei Bedarf.
Cristian Ciupitu

Antworten:

6

Multilog von DJBs Daemontools kann (fast) genau das tun, was Sie verlangen. Der einzige Nachteil, den ich kenne, ist, dass nicht viele Distributionen ein Paket für Daemontools enthalten .

Wenn Sie Ihre Anwendung nicht mit svc(Teil der Daemontools) verwalten, müssen Sie einen Weg finden, die Ausgabe an einen Befehl wie zu leiten

multilog t s1048576 n100 ./my_log_directory

Dies bedeutet:

  • t: Einsatz eines tai64n Zeitstempel (die mit zu lesbarer Zeit übersetzt werden tai64nlocal)
  • s1048576: Drehen Sie die Protokolldatei, wenn sie auf 1 MB wächst
  • n100: Bewahren Sie nicht mehr als 100 gedrehte Dateien auf
  • ./my_log_directory: alles, was mit .oder beginnt /- schreiben Sie das Protokoll in dieses Verzeichnis

Das geschriebene Protokoll hat den Dateinamen current. Wenn das Protokoll durch Multilog gedreht wird, wird es in den Namen umbenannt, in @<tai64n timestamp>.sdem der Dateiname die Zeit angibt, zu der die Datei gedreht wurde. Die Erweiterung kann sein, .swenn die Datei sicher geleert wurde oder .uwenn sie abgeschnitten wurde.

Für weitere Informationen überprüfen Sie einfach die Links.

Chutz
quelle
Scheint wie der Befehl, nach dem ich suche. Zum Glück ist es unter Ubuntu verfügbar: launchpad.net/ubuntu/+source/daemontools
SztupY