Mám jednoduchý úryvek Pythonu spravovaný systemd
služba, která se přihlásí do rsysogd
démon, kde jsem definoval konfigurační soubor, který jej vložím na server syslog ve formátu, který jsem definoval. To zatím funguje dobře.
V níže uvedeném kódu předávám argument jako řetězec, který se chci přihlásit na server. Tento kód níže používám jako modul a používám jej pouze pro protokolování, skutečný skript jej používá pro účely protokolování.
#!/usr/bin/env python
import syslog
import sys
syslog.openlog(facility=syslog.LOG_LOCAL0)
syslog.syslog(syslog.LOG_INFO, sys.argv[1])
Protože aplikaci spravuje systemd
zpřístupňuje kopii syslogu při pohledu z journalctl -xe
a journalctl -u <my-service>
což si nepřeji, aby se stalo, protože mám jiné důležité informace, které zapisuji do deníků.
Definice služby je
[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
a v /etc/systemd/journald.conf
soubor, nepovolil jsem žádné z možností, které budou k dispozici. Vyhledal jsem tuto dokumentaci journald.conf, abych použil ForwardToSyslog=no
a provedl restart journald
službu jako
systemctl restart systemd-journald
a také restartoval svou servisní jednotku, ale vidím odhlášení ze serveru syslog a také do deníků. Jaká možnost mi zde chybí?
Přijatá odpověď:
Mám jednoduchý úryvek Pythonu spravovaný službou systemd, která se přihlásí k démonu rsys[l]ogd […]
Ne, nemáte.
To, co máte, je služba, která se přihlásí do deníku systemd. Server poslouchá na dobře známém /dev/log
socket, se kterým váš Python program mluví, není rsyslogd
. Je to systemd-journald
. rsyslogd
je připojen na druhou stranu z systemd-journald
a váš program Python s ním nekomunikuje.
Z toho by mělo být zřejmé, že jediný způsob, jak neposílat věci přes systemd-journald
je použít nějaké jiné cestu do rsyslogd
, ne dobře známý socket, který vaše knihovna Python standardně používá. To vše závisí na tom, jak jste nakonfigurovali rsyslogd
.
- Je možné, že jste zapnuli UDP server pomocí
imudp
V takovém případě můžete svému programu v Pythonu říci, aby to použil, pomocí jiné knihovny Pythonu, která mluví s takovým UDP serverem. (Knihovna syslog Pythonu je pevně připojena k použití známého místního soketu.) - Nebo (a lépe, vzhledem k tomu, že si musíte dávat pozor na to, abyste neotevírali službu UDP světu mimo váš počítač) jste mohli zadat
rsyslogd
druhý, ne příliš známý,AF_LOCAL
socket k poslechu tak, že to nakonfigurujete vimuxsock
konfiguraci modulu. Opět budete muset svému programu v Pythonu sdělit, aby to použil a použil jinou knihovnu Pythonu.
Co přesně děláte ve svém programu Python, je nad rámec této odpovědi.
Další čtení
- https://unix.stackexchange.com/a/294206/5132