it-swarm.com.de

So leiten Sie die Ausgabe des systemd-Dienstes in eine Datei um

Ich versuche, o/p eines systemd-Dienstes in eine Datei umzuleiten, aber es scheint nicht zu funktionieren. Ich mache es wie folgt: 

[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 schlagen Sie den richtigen Ansatz vor, um o/p in eine Datei umzuleiten

85
meallhour

Ich denke, es gibt einen eleganteren Weg, das Problem zu lösen: Senden Sie stdout/stderr mit einem Bezeichner 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

Nehmen Sie dann an, dass Ihre Distribution rsyslog zum Verwalten von Syslogs verwendet, und erstellen Sie eine Datei in /etc/rsyslog.d/<new_file>.conf mit dem folgenden Inhalt:

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

starten Sie rsyslog (Sudo systemctl restart rsyslog) neu und genießen Sie es! Ihr Programm stdout/stderr ist weiterhin über journalctl (Sudo journalctl -u <your program identifier>) verfügbar, aber auch in Ihrer gewünschten Datei.

Quelle: http://wiki.rsyslog.com/index.php/Filtering_by_program_name (defekter Link, Archiv verfügbar auf Archive.org )

139
Valerio Versace

Möglicherweise erhalten Sie diesen Fehler:

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

Auf der systemd.exec(5)-Manpage: 

StandardOutput=

Steuert, wo der Dateideskriptor 1 (STDOUT) der ausgeführten Prozesse angeschlossen ist. Nimmt eines von inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console oder socket an.

Auf der Manpage systemd.exec(5) werden weitere Optionen für die Protokollierung erläutert. Siehe auch die Manpages systemd.service(5) und systemd.unit(5).

Oder vielleicht können Sie so etwas (alles in einer Zeile) ausprobieren:

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

Wenn Sie eine neuere Distribution mit einer neueren systemd ( systemd Version 236 oder neuer ) haben, können Sie die Werte von StandardOutput oder StandardError auf file:YOUR_ABSPATH_FILENAME setzen.


Lange Geschichte:

In neueren Versionen von systemd gibt es eine relativ neue Option ( Die Github-Anforderung stammt von 2016 ish und die Erweiterung wird zusammengeführt/geschlossen 2017 ish ). Hier können Sie die Werte von StandardOutput oder StandardError auf file:YOUR_ABSPATH_FILENAME setzen. Die file:path-Option ist in der neuesten systemd.exec-Manpage dokumentiert.

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

29

Wenn aus irgendeinem Grund rsyslog nicht verwendet werden kann, wird Folgendes ausgeführt: ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"

11
Tigra

Angenommen, die Protokolle befinden sich bereits unter stdout/stderr und haben das Protokoll der systemd unit in /var/log/syslog.

journalctl -u unitxxx.service

Jun 30 13:51:46 Host unitxxx[1437]: time="2018-06-30T11:51:46Z" level=info msg="127.0.0.1
Jun 30 15:02:15 Host unitxxx[1437]: time="2018-06-30T13:02:15Z" level=info msg="127.0.0.1
Jun 30 15:33:02 Host unitxxx[1437]: time="2018-06-30T13:33:02Z" level=info msg="127.0.0.1
Jun 30 15:56:31 Host unitxxx[1437]: time="2018-06-30T13:56:31Z" level=info msg="127.0.0.1

Config rsyslog (Systemprotokollierungsdienst)

# Create directory for log file
mkdir /var/log/unitxxx

# Then add config file /etc/rsyslog.d/unitxxx.conf

if $programname == 'unitxxx' then /var/log/unitxxx/unitxxx.log
& stop

rsyslog neu starten

systemctl restart rsyslog.service
0
Hieu Huynh

Ich würde vorschlagen, stdout und stderr-Datei in systemd service-Datei selbst hinzuzufügen.

Wie Sie es konfiguriert haben, sollte es nicht gefallen: 

StandardOutput=/var/log1.log
StandardError=/var/log2.log

Es sollte sein: 

StandardOutput=file:/var/log1.log
StandardError=file:/var/log2.log

Stellen Sie sicher, dass Sie bereits ein Verzeichnis erstellen. Ich denke, es unterstützt keine Verzeichnisse.

0
Rajat jain