Ho un semplice frammento di Python gestito da un systemd
servizio che accede a rsysogd
demone in cui ho definito un file di configurazione per inserirlo in un server syslog con un formato che ho definito. Finora funziona bene.
Nel codice seguente, sto passando l'argomento come la stringa che voglio accedere al server. Sto usando questo codice qui sotto come modulo e lo sto usando solo per la registrazione, lo script effettivo lo usa per scopi di registrazione.
#!/usr/bin/env python
import syslog
import sys
syslog.openlog(facility=syslog.LOG_LOCAL0)
syslog.syslog(syslog.LOG_INFO, sys.argv[1])
Poiché l'applicazione è gestita da systemd
sta rendendo disponibile una copia del syslog visto da journalctl -xe
e il journalctl -u <my-service>
cosa che non desidero che accada perché ho altre informazioni critiche che sto registrando nei registri del diario.
La definizione del servizio è
[Unit]
Description=Computes device foobar availability status
[Service]
Type=simple
EnvironmentFile=/etc/sysconfig/db_EndPoint
ExecStart=/usr/bin/python /opt/foobar/foobar.py
WatchdogSec=60
RestartSec=10
Restart=always
LimitNOFILE=4096
[Install]
WantedBy=default.target
e nel /etc/systemd/journald.conf
file, non ho abilitato nessuno delle opzioni disponibili. Ho cercato questa documentazione journald.conf per usare ForwardToSyslog=no
e ha riavviato journald
servizio come
systemctl restart systemd-journald
e ho anche riavviato la mia unità di servizio, ma vedo i log out sul server syslog e anche ai registri del diario. Quale opzione mi manca qui?
Risposta accettata:
Ho un semplice frammento di codice Python gestito da un servizio systemd che si collega al demone rsys[l]ogd […]
No, non l'hai fatto.
Quello che hai è un servizio che si registra nel diario di systemd. Il server in ascolto sul noto /dev/log
il socket con cui sta parlando il tuo programma Python non è rsyslogd
. È systemd-journald
. rsyslogd
è attaccato all'altro lato di systemd-journald
, e il tuo programma Python non sta parlando con esso.
Da questo, dovrebbe essere evidente che l'unico modo per non inviare materiale tramite systemd-journald
è usare un altro altro instradare a rsyslogd
, non il noto socket che la tua libreria Python usa per impostazione predefinita. Tutto dipende da come hai configurato rsyslogd
.
- È possibile che tu abbia attivato un server UDP con
imudp
modulo, nel qual caso potresti dire al tuo programma Python di usarlo usando una libreria Python diversa che parla a un tale server UDP. (La libreria syslog di Python è cablata per utilizzare il noto socket locale.) - Oppure (e meglio, dato che devi stare attento a non aprire un servizio UDP al mondo fuori dalla tua macchina) avresti potuto dare
rsyslogd
un secondo, non molto noto,AF_LOCAL
socket da ascoltare configurandolo inimuxsock
configurazione del modulo. Ancora una volta, dovrai dire al tuo programma Python di usarlo e utilizzare una libreria Python diversa.
Quello che fai esattamente nel tuo programma Python va oltre lo scopo di questa risposta.
Ulteriori letture
- https://unix.stackexchange.com/a/294206/5132