Wie kann ich die Standardausgabe und den Fehler eines systemd-Dienstes mit einer Datei mit einem Datum im Pfad verbinden?

Wie kann ich die Standardausgabe und den Fehler eines systemd-Dienstes mit einer Datei mit einem Datum im Pfad verbinden?

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, StandardOutputkönnten Sie Ihrer Software sagen, dass sie Protokolle an /path/$( hier irgendwas Bashy)/console.log senden soll und im Rahmen der postrotateErstellung 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"

verwandte Informationen