2016-06-02 16 views
43

Ich versuche, O/P eines Systemd-Diensts in eine Datei umleiten, aber es scheint nicht zu funktionieren. Ich tue es wie folgt:Wie Umleitung der Ausgabe von Systemd-Dienst in eine Datei

[Unit] 
Description=customprocess 
After=network.target 

[Service] 
Type=forking 
ExecStart=/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 
StandardOutput=/var/log1.log 
StandardError=/var/log2.log 
Restart=always 

[Install] 
WantedBy=multi-user.target 

Bitte den richtigen Ansatz vorschlagen o/p in einer Datei

Antwort

61

Ich denke, es ist ein eleganter Weg, um das Problem zu lösen: Bitte senden Sie die stdout/stderr mit einer Kennung an syslog und instruieren Der Syslog-Manager teilt seine Ausgabe nach Programmname.

Verwenden Sie die folgenden Eigenschaften in Ihrer systemd Service Unit-Datei:

StandardOutput=syslog 
StandardError=syslog 
SyslogIdentifier=<your program identifier> # without any quote 

Dann Ihre Verteilung angenommen wird rsyslog mit Syslogs verwalten, um eine Datei in /etc/rsyslog.d/<new_file>.conf mit folgendem Inhalt:

if $programname == '<your program identifier>' then /path/to/log/file.log 
if $programname == '<your program identifier>' then ~ 

rsyslog neu starten (sudo systemctl restart rsyslog) und viel Spaß! Ihr Programm stdout/stderr wird weiterhin über journalctl (sudo journalctl -u) verfügbar sein, aber sie werden auch in Ihrer Datei Ihrer Wahl verfügbar sein.

Quelle: http://wiki.rsyslog.com/index.php/Filtering_by_program_name

+0

Funktioniert hervorragend für die Konfiguration der Protokollierung für eine SpringBoot App ... –

+3

Nicht für mich auf Ubuntu 16.04. 'journalctl -u' funktioniert immer noch, aber nichts wird an die angegebene Datei gesendet. –

+0

Dies funktioniert gut auf Debian-Stretch, aber es beschwert sich, dass "~" veraltet ist und stattdessen "Stop" sollte verwendet werden. Beachten Sie auch, dass die zweite Zeile auf "& Stop" verkürzt werden kann, wenn die beiden aufeinander folgen. – jlh

18

Sie möglicherweise diesen Fehler zu umleiten:

Failed to parse output specifier, ignoring: /var/log1.log 

Vom systemd.exec(5) Manpage:

StandardOutput=

Controls where file descriptor 1 (STDOUT) of the executed processes is connected to. Takes one of inherit , null , tty , journal , syslog , kmsg , journal+console , syslog+console , kmsg+console or socket .

Die systemd.exec(5) Manpage erklärt andere Optionen r begeistert von der Protokollierung. Siehe auch die Manpages systemd.service(5) und systemd.unit(5).

Oder vielleicht können Sie Dinge wie diese versuchen (alles in einer Zeile):

ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log' 
+5

Unter den Optionen wird die Anmeldung im Systemd-Journal empfohlen. Sie können nur die Protokolle für Ihren Prozess im Journal anzeigen, indem Sie 'journalctl -u your-unit-name' verwenden. –

+6

Um eine Datei anzugeben, gibt es eine andere Option, wie in der Dokumentation angegeben: 'Die Option fd verbindet den Ausgabestrom mit einem einzelnen Dateideskriptor, der von einer Socket-Einheit bereitgestellt wird.Ein benutzerdefinierter benannter Dateideskriptor kann als Teil dieser Option nach einem ":" (z. B. "fd: foobar") angegeben werden. ' – orion

+2

@orion: Bitte machen Sie eine separate Antwort. :-) –

4

für einen irgendeinem Grund Wenn nicht rsyslog verwenden, dies zu tun: ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"

3

Wenn Sie eine neuere Distribution mit einem neueren systemd (systemd version 236 or newer) haben, können Sie die festlegen Werte von StandardOutput oder StandardError bis file:YOUR_ABSPATH_FILENAME.


Lange Geschichte:

In neueren Versionen von systemd gibt es eine relativ neue Option (the github request is from 2016 ish and the enhancement is merged/closed 2017 ish), wo Sie die Werte von StandardOutput oder StandardError-file:YOUR_ABSPATH_FILENAME einstellen. Die Option file:path ist in der most recent systemd.exec man page dokumentiert.

Diese neue Funktion ist relativ neu und daher nicht für ältere Distributionen wie Centos-7 (oder irgendeinen Centos davor) verfügbar.