我有一个由服务管理的简单 Python 片段systemd
,该服务记录到rsysogd
守护进程,在该守护进程中我定义了一个配置文件,以将其以我定义的格式放入系统日志服务器。到目前为止,这工作正常。
在下面的代码中,我将参数作为我想要登录到服务器的字符串传递。我使用下面的代码作为模块并单独使用它进行日志记录,实际的脚本使用它来进行日志记录。
#!/usr/bin/env python
import syslog
import sys
syslog.openlog(facility=syslog.LOG_LOCAL0)
syslog.syslog(syslog.LOG_INFO, sys.argv[1])
由于应用程序是由systemd
它管理的,所以当从 和 中看到时,它会生成可用的系统日志副本,journalctl -xe
而journalctl -u <my-service>
我不希望发生这种情况,因为我在日志日志中记录了其他关键信息。
服务定义是
[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
并在/etc/systemd/journald.conf
文件中,我还没有启用任何可用的选项。我查了一下这个日志配置文件使用文档ForwardToSyslog=no
并重新启动journald
服务
systemctl restart systemd-journald
并且还重新启动了我的服务单元,但我看到日志输出到系统日志服务器和也到日志日志。我在这里缺少什么选项?
答案1
我有一个由 systemd 服务管理的简单 Python 片段,该服务记录到 rsys[l]ogd 守护进程 [...]
不,你还没有。
您拥有的是记录到 systemd 日志的服务。侦听您的 Python 程序正在与之通信的众所周知的/dev/log
套接字的服务器不是rsyslogd
。这是systemd-journald
。 rsyslogd
是附着在另一侧的systemd-journald
,而你的 Python 程序并没有与它对话。
由此看来,显而易见的是,不通过以下方式发送东西的唯一方法systemd-journald
是使用一些其他路线到rsyslogd
,不是Python 库默认使用的众所周知的套接字。这一切都取决于您的配置方式rsyslogd
。
- 您可能已使用以下命令打开了 UDP 服务器
imudp
模块打开了 UDP 服务器,在这种情况下,您可以通过使用与此类 UDP 服务器通信的不同 Python 库来告诉您的 Python 程序使用该模块。 (Python syslog 库被硬连线以使用众所周知的本地套接字。) - 或者(更好的是,考虑到您必须小心不要向机器之外的世界开放 UDP 服务)您可以通过在模块的配置中进行配置来提供
rsyslogd
第二个不为人所知的AF_LOCAL
套接字来侦听。imuxsock
同样,您必须告诉您的 Python 程序使用它并使用不同的 Python 库。
您在 Python 程序中具体执行的操作超出了本答案的范围。