2016-06-02 14 views
43

Sto provando a reindirizzare o/p di un servizio systemd su un file ma non sembra funzionare. Lo sto facendo come segue:Come reindirizzare l'output del servizio systemd su un file

[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 in un file

risposta

61

Penso che ci sia un modo più elegante per risolvere il problema: inviare l'output/error a syslog con un identificatore e istruzioni il tuo gestore syslog per dividere l'output per nomeprogramma.

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

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

Quindi, supponendo che la vostra distribuzione sta usando rsyslog per gestire syslogs, creare un file nella /etc/rsyslog.d/<new_file>.conf con il seguente contenuto:

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

riavvia rsyslog (sudo systemctl restart rsyslog) e divertiti! Il tuo programma stdout/stderr sarà ancora disponibile tramite journalctl (sudo journalctl -u) ma saranno anche disponibili nel tuo file di scelta.

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

+0

Funziona alla grande per la configurazione della registrazione per un'app di SpringBoot ... –

+3

Non funziona per me su Ubuntu 16.04. 'journalctl -u' funziona ancora ma nulla viene inviato al file specificato. –

+0

Funziona alla grande su Debian stretch, tuttavia lamenta che '~' è deprecato e che invece dovrebbe essere usato 'stop'. Si noti inoltre che la seconda riga può essere abbreviata in '& stop' se i due si susseguono uno dopo l'altro. – jlh

18

È forse questo errore:

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

Dalla pagina systemd.exec(5) man:

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 .

La pagina di systemd.exec(5) uomo spiega altre opzioni r euforico al logging. Vedi anche le pagine man systemd.service(5) e systemd.unit(5).

O forse si può provare cose come questa (tutto su una riga):

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

Tra le opzioni, si consiglia di accedere al diario di sistema. Visualizzi solo i log del tuo processo nel journal usando 'journalctl -u your-unit-name'. –

+6

Per specificare un file, esiste un'altra opzione di pulizia, come indicato dalla documentazione: 'L'opzione fd collega il flusso di output a un singolo descrittore di file fornito da un'unità socket.Un descrittore di file con nome personalizzato può essere specificato come parte di questa opzione, dopo un ":" (ad esempio "fd: foobar"). " – orion

+2

@orion: si prega di fare una risposta separata. :-) –

4

Se per un 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"

3

Se si dispone di una distribuzione più recente con un più nuovo systemd (systemd version 236 or newer), è possibile impostare la valori di StandardOutput o StandardError a file:YOUR_ABSPATH_FILENAME.


Lunga storia:

Nelle versioni più recenti di systemd c'è una relativamente nuova opzione (the github request is from 2016 ish and the enhancement is merged/closed 2017 ish) dove è possibile impostare i valori di StandardOutput o StandardError-file:YOUR_ABSPATH_FILENAME. L'opzione file:path è documentata nello most recent systemd.exec man page.

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

Problemi correlati