Ich möchte einen Serverprozess unter systemd ausführen und seine Standardausgabe und seinen Fehler an eine Datei anhängen, wobei der Dateipfad ein Datum enthält, wie folgt:
/initech/logs/tps-report-app/sales/2023/09/11/console.log
Im Idealfall würde ich mir wünschen, dass dieser Pfad automatisch aktualisiert wird, wenn sich das Datum ändert. Es ist aber auch nicht das Ende der Welt, wenn dies nicht geschieht, da wir unsere Server ohnehin über Nacht neu starten.
Eine Sache, die ich nicht machen möchte, ist die traditionelle Protokollrotation, bei der die Ausgabe in eine Datei mit einem festen Pfad geschrieben und später in eine Datei mit einem datierten Pfad rotiert wird.
DerKonfigurationsoption „StandardOutput“ermöglicht mir, die Ausgabe an eine Datei anzuhängen append:path
, aber in dieser Zeichenfolge wird keine Variablensubstitution erwähnt, daher gehe ich davon aus, dass dies behoben werden muss. Gibt es eine Möglichkeit, das Datum in diesen Pfad einzubinden?
Wenn nicht, was ist hier der beste Ansatz? Die Ausgabe über eine benannte Pipe oder etwas Ähnliches mit einem Protokoll-Daemon wie Multilog verbinden? Gibt es so etwas im Systemd-Toolkit? Den Serverprozess mit einer Art Chainloader-Skript umschließen, das die Standardausgabe und Fehler umleitet? Etwas anderes?
Antwort1
Sie könnten die Protokolle beispielsweise täglich mit rollen logrotate
. Anstatt zu verwenden, StandardOutput
könnten Sie Ihrer Software sagen, dass sie Protokolle an /path/$( hier irgendwas Bashy)/console.log senden soll und im Rahmen der postrotate
Erstellung des Pfads den betreffenden Dienst neu starten soll.
Bearbeiten: Ich habe gerade bemerkt, dass Sie erwähnen, dass die Server jede Nacht neu gestartet werden. Dann müssen Sie nur sicherstellen, dass der Protokolldateipfad vorhanden ist. In diesem Fall würde ich die Erstellung des Protokolldateipfads in integrieren ExecStart
. So etwas wie
ExecStart=/bin/bash -ac \
"mkdir /my/path -p && run_app.sh"