it-swarm-eu.dev

Come reindirizzare l'output del servizio systemd su un file

Sto cercando di reindirizzare o/p di un servizio systemd su un file, ma non sembra funzionare. Lo sto facendo come segue: 

[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

Si prega di suggerire l'approccio corretto per reindirizzare o/p su un file

85
meallhour

Penso che ci sia un modo più elegante per risolvere il problema: inviare lo stdout/stderr a syslog con un identificatore e chiedere al proprio gestore di syslog di dividerne l'output in base al nome del programma.

Utilizzare le seguenti proprietà nel file dell'unità di servizio systemd:

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

Quindi, supponendo che la tua distribuzione stia utilizzando rsyslog per gestire syslog, crea un file in /etc/rsyslog.d/<new_file>.conf con il seguente contenuto:

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

riavvia rsyslog (Sudo systemctl restart rsyslog) e divertiti! Il tuo programma stdout/stderr sarà ancora disponibile tramite journalctl (Sudo journalctl -u <your program identifier>) ma sarà anche disponibile nel tuo file di scelta.

Fonte: http://wiki.rsyslog.com/index.php/Filtering_by_program_name (link non funzionante, archivio disponibile su Archive.org )

139
Valerio Versace

È possibile ottenere questo errore:

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

Dalla pagina man di systemd.exec(5)

StandardOutput=

Controlli a cui è collegato il descrittore di file 1 (STDOUT) dei processi eseguiti. Uno di inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console o socket.

La pagina man di systemd.exec(5) illustra altre opzioni relative alla registrazione. Vedi anche le pagine man di systemd.service(5) e systemd.unit(5).

O forse puoi provare cose come questa (tutte su una riga):

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

Se si dispone di una nuova distribuzione con un systemd ( systemd versione 236 o più recente ), è possibile impostare i valori di StandardOutput o StandardError su file:YOUR_ABSPATH_FILENAME.


Lunga storia:

Nelle versioni più recenti di systemd esiste un'opzione relativamente nuova ( la richiesta github è ish 2016 e il miglioramento è unito/chiuso 2017 ish ) dove è possibile impostare i valori di StandardOutput o StandardError su file:YOUR_ABSPATH_FILENAME. L'opzione file:path è documentata nella ultima pagina man di systemd.exec .

Questa nuova funzione è relativamente nuova e quindi non è disponibile per le distribuzioni più vecchie come centos-7 (o qualsiasi altro prima).

29

Se per qualche motivo non è possibile utilizzare rsyslog, questo farà: ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"

11
Tigra

Supponiamo che i log siano già messi in stdout/stderr , e che il log di unità di systemd 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 (System Logging Service)

# 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

Riavvia rsyslog

systemctl restart rsyslog.service
0
Hieu Huynh

Vorrei suggerire di aggiungere file stdout e stderr nel file systemd service stesso.

Come hai configurato non dovrebbe come: 

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

Dovrebbe essere: 

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

Assicurati di aver già creato la directory. Suppongo che non supporti per creare directory.

0
Rajat jain