Ich habe ein einfaches Python-Snippet, das von einem systemd
verwaltet wird Dienst, der sich beim rsysogd
anmeldet Daemon, in dem ich eine Konfigurationsdatei definiert habe, um sie mit einem von mir definierten Format auf einen Syslog-Server zu legen. Das funktioniert soweit gut.
Im folgenden Code übergebe ich das Argument als Zeichenfolge, mit der ich mich beim Server anmelden möchte. Ich verwende diesen Code unten als Modul und verwende ihn nur für die Protokollierung, das eigentliche Skript verwendet dies für Protokollierungszwecke.
#!/usr/bin/env python
import syslog
import sys
syslog.openlog(facility=syslog.LOG_LOCAL0)
syslog.syslog(syslog.LOG_INFO, sys.argv[1])
Da die Anwendung von systemd
verwaltet wird es stellt eine Kopie des Syslogs zur Verfügung, wenn es von journalctl -xe
aus gesehen wird und den journalctl -u <my-service>
was ich nicht möchte, weil ich andere wichtige Informationen habe, die ich in Journalprotokollen protokolliere.
Die Dienstdefinition ist
[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
und in der /etc/systemd/journald.conf
Datei habe ich keine aktiviert der verfügbaren Optionen. Ich habe diese Dokumentation zu journald.conf nachgeschlagen, um ForwardToSyslog=no
zu verwenden und einen Neustart von journald
durchgeführt Dienst als
systemctl restart systemd-journald
und auch meine Serviceeinheit neu gestartet, aber ich sehe die Protokolle zum Syslog-Server und auch zu den Journalprotokollen. Welche Option übersehe ich hier?
Akzeptierte Antwort:
Ich habe ein einfaches Python-Snippet, das von einem systemd-Dienst verwaltet wird, der sich beim rsys[l]ogd-Daemon […]
anmeldetNein hast du nicht.
Was Sie haben, ist ein Dienst, der sich im systemd-Journal protokolliert. Der Server lauscht auf dem bekannten /dev/log
Socket, mit dem Ihr Python-Programm kommuniziert, ist nicht rsyslogd
. Es ist systemd-journald
. rsyslogd
wird an der anderen Seite angebracht von systemd-journald
, und Ihr Python-Programm spricht nicht damit.
Daraus sollte ersichtlich sein, dass der einzige Weg nichts über systemd-journald
zu senden ist ist, etwas anderes zu verwenden Route zu rsyslogd
, nicht der bekannte Socket, den Ihre Python-Bibliothek standardmäßig verwendet. Das hängt alles davon ab, wie Sie rsyslogd
konfiguriert haben .
- Möglicherweise haben Sie mit dem
imudp
einen UDP-Server eingeschaltet Modul, in diesem Fall könnten Sie Ihr Python-Programm anweisen, dieses zu verwenden, indem Sie eine andere Python-Bibliothek verwenden, die mit einem solchen UDP-Server kommuniziert. (Die Python-Syslog-Bibliothek ist fest verdrahtet, um den bekannten lokalen Socket zu verwenden.) - Oder (und besser, da Sie vorsichtig sein müssen, keinen UDP-Dienst für die Welt außerhalb Ihres Rechners zu öffnen) Sie hätten
rsyslogd
angeben können ein zweites, nicht sehr bekanntes,AF_LOCAL
Socket zum Abhören, indem Sie dies imimuxsock
konfigurieren Modulkonfiguration. Auch hier müssen Sie Ihrem Python-Programm mitteilen, dass es das verwenden soll, und eine andere Python-Bibliothek verwenden.
Was genau Sie in Ihrem Python-Programm tun, würde den Rahmen dieser Antwort sprengen.
Weiterführende Literatur
- https://unix.stackexchange.com/a/294206/5132