从 python 脚本登录到 rsyslog 工具

400*_*Cat 7 logging syslog rsyslog python-3.x

我有这个/etc/rsyslog.conf

local0.*     /var/log/local.log
Run Code Online (Sandbox Code Playgroud)

我有一个简单的 python 脚本,它从标准输入中读取并应该发送到 local0

#!/usr/bin/python3

import sys, syslog

syslog.openlog(ident="MY_SCRIPT", facility=syslog.LOG_LOCAL0)

for line in sys.stdin:
    syslog.syslog(syslog.LOG_WARNING, f"Message\n\n")
Run Code Online (Sandbox Code Playgroud)

但它不起作用。rsyslog没有看到消息local0

只有当我更改为*.*rsyslog才能看到它:

*.*     /var/log/local.log
Run Code Online (Sandbox Code Playgroud)

我假设我没有在我的 python 脚本中正确配置工具。

如何指定我要登录local0

int*_*ika 3

Rsyslog 和本地*:

Rsysloglocal0具有local7syslog 为用户提供的“自定义”未使用设施。如果开发人员创建应用程序并希望将其记录到 syslog,或者如果您希望将任何内容的输出重定向到 syslog(例如 Apache 日志),则可以选择将其发送到任何设施local#。然后,您可以使用/etc/syslog.conf(或/etc/rsyslog.conf) 将发送到该文件的日志保存到local#文件,或将其发送到远程服务器 ( source )。

配置:

在下面/etc/rsyslog.conf

local0.*     /var/log/local.log
Run Code Online (Sandbox Code Playgroud)

这是正确的,它将日志文件分配/var/log/local.log给登录到 local0 的应用程序。作为另一个示例kern.=warn -/var/log/kernel/warnings.log,可用于记录内核警告。

Python 应用程序/脚本:

#!/usr/bin/python3
import sys, syslog

syslog.openlog(ident="MY_SCRIPT", facility=syslog.LOG_LOCAL0)

for line in sys.stdin:
    syslog.syslog(syslog.LOG_WARNING, f"Message {line}\n\n")
Run Code Online (Sandbox Code Playgroud)

初始代码确实有效,正如评论中指出的,可以用作替代方案,并且{line}变量已按照 @apoorva-kamath 的建议添加...

这里重要的方面是Python 脚本和 Rsyslog 之间的通信

另外,正如命令 try 所指出的那样,重新加载 rsyslog systemctl restart rsyslog;您还可以使用以下命令检查 Rsyslog 配置rsyslogd -N1并检查 rsyslog 是否正常工作:

sudo cat /var/log/messages | grep rsyslog
Run Code Online (Sandbox Code Playgroud)

根据 Python 脚本运行上下文,与 Rsyslog 的通信可能会失败,需要有关配置的更多详细信息,否则您可以尝试(从脚本的上下文):

logger -p local0.error "TroubleshootingTest"
Run Code Online (Sandbox Code Playgroud)

最后检查数据传输:

sudo netstat -taupn | grep syslog
Run Code Online (Sandbox Code Playgroud)

文档:

有关Python syslogRsyslogRsyslog 工具故障排除的更多详细信息