Ich denke, es gibt einen eleganteren Weg, um das Problem zu lösen: Senden Sie stdout / stderr mit einer Kennung an syslog und weisen Sie Ihren Syslog-Manager an, seine Ausgabe nach Programmnamen aufzuteilen.
Verwenden Sie die folgenden Eigenschaften in Ihrer systemd Service Unit-Datei:
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote
Angenommen, Ihre Distribution verwendet rsyslog zum Verwalten von Syslogs, erstellen Sie eine Datei /etc/rsyslog.d/<new_file>.conf
mit dem folgenden Inhalt:
if $programname == '<your program identifier>' then /path/to/log/file.log
& stop
Machen Sie nun die Protokolldatei von syslog beschreibbar:
# ls -alth /var/log/syslog
-rw-r----- 1 syslog adm 439K Mar 5 19:35 /var/log/syslog
# chown syslog:adm /path/to/log/file.log
Starten Sie rsyslog ( sudo systemctl restart rsyslog
) neu und genießen Sie! Ihr Programm stdout / stderr ist weiterhin über journalctl ( sudo journalctl -u <your program identifier>
) verfügbar , sie sind jedoch auch in der Datei Ihrer Wahl verfügbar.
Quelle über archive.org
journalctl -u
funktioniert immer noch, aber es wird nichts an die angegebene Datei gesendet.~
es veraltet ist undstop
stattdessen verwendet werden sollte. Beachten Sie auch, dass die zweite Zeile gekürzt werden kann,& stop
wenn die beiden nacheinander kommen./etc/rsyslog.d/<newfile>.conf
Inhalt:programname, isequal, "<your program identifier>" /var/log/somelog.log
geändert habe in: Hier ist die Dokumentation zu den rsyslog-Filtern: rsyslog.com/doc/v8-stable/configuration/filters.html Und hier sind Dokumente zu den Eigenschaften wieprogramname
: rsyslog.com/doc/master/configuration/properties .htmlrsyslog
sie einen eigenen Benutzer hatsyslog
und Schreibzugriff auf den Speicherort der Protokolle haben muss. Alsochown
entsprechend verwenden. Hoffe das hilft jemandem.Wenn Sie eine neuere Distribution mit einer neueren
systemd
(systemd
Version 236 oder neuer ) haben, können Sie die Werte vonStandardOutput
oderStandardError
auf einstellenfile:YOUR_ABSPATH_FILENAME
.Lange Geschichte:
In neueren Versionen von
systemd
gibt es eine relativ neue Option ( die Github-Anforderung stammt von 2016 ish und die Erweiterung wird 2017 ish zusammengeführt / geschlossen ), mit der Sie die Werte vonStandardOutput
oderStandardError
auf festlegen könnenfile:YOUR_ABSPATH_FILENAME
. Diefile:path
Option ist in der neuestensystemd.exec
Manpage dokumentiert .Diese neue Funktion ist relativ neu und daher für ältere Distributionen wie Centos-7 (oder Centos davor) nicht verfügbar.
quelle
copytruncate
in verwendet werden musslogrotate
.Möglicherweise erhalten Sie diesen Fehler:
Von der
systemd.exec(5)
Manpage:In der
systemd.exec(5)
Manpage werden weitere Optionen zur Protokollierung erläutert. Siehe auch diesystemd.service(5)
undsystemd.unit(5)
Manpages.Oder vielleicht können Sie solche Dinge ausprobieren (alles in einer Zeile):
quelle
journalctl -u your-unit-name
.The fd option connects the output stream to a single file descriptor provided by a socket unit. A custom named file descriptor can be specified as part of this option, after a ":" (e.g. "fd:foobar").
2>&1 > /var/log.log
zu diesem :2>&1 >> /var/log.log
. Vielen DankIch würde vorschlagen, die systemd- Datei selbst hinzuzufügen
stdout
undstderr
abzulegenservice
.Verweis: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Wie Sie konfiguriert haben, sollte es nicht gefallen:
Es sollte sein:
Dies funktioniert, wenn Sie den Dienst nicht immer wieder neu starten möchten .
Dadurch wird eine neue Datei erstellt und nicht an die vorhandene Datei angehängt.
Verwenden Sie stattdessen:
HINWEIS: Stellen Sie sicher, dass Sie das Verzeichnis bereits erstellt haben. Ich denke, es wird nicht unterstützt, ein Verzeichnis zu erstellen.
quelle
file:
funktioniert die Route beim ersten Laden des Dienstes, aber beim anschließenden Neustart wird sie nicht mehr in die Datei geschrieben. Ich habe esappend:
aus den Dokumenten versucht und das hat überhaupt nicht funktioniert.file:
jedes Mal am Anfang der Datei geschrieben wird und nicht abgeschnitten wird. Diesappend:
scheint eine neue Ergänzung zu sein (dh nicht auf derman systemd.exec
Seite unter Ubuntu 18.04 vorhanden).Wenn rsyslog aus irgendeinem Grund nicht verwendet werden kann, reicht dies aus:
ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
quelle
Angenommen, die Protokolle sind bereits in stdout / stderr abgelegt und die Systemd-Einheit hat sich angemeldet
/var/log/syslog
Config rsyslog (System Logging Service)
Starten Sie rsyslog neu
quelle
Wir verwenden Centos7, eine Spring Boot-Anwendung mit systemd. Ich habe Java wie unten ausgeführt. und das Setzen von StandardOutput auf Datei funktionierte bei mir nicht.
Die folgende Problemumgehungslösung funktioniert ohne Festlegen von StandardOutput. Java durch sh wie unten laufen lassen.
quelle
Kurze Antwort:
Wenn Sie nicht möchten, dass die Dateien bei jeder Ausführung des Dienstes gelöscht werden, verwenden Sie stattdessen Anhängen:
quelle