从 python 脚本登录到 rsyslog 工具
Posted
技术标签:
【中文标题】从 python 脚本登录到 rsyslog 工具【英文标题】:Log to rsyslog facility from a python script 【发布时间】:2020-09-18 13:21:52 【问题描述】:我的/etc/rsyslog.conf
有这个:
local0.* /var/log/local.log
我有一个简单的 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")
但它不起作用。 rsyslog
没有看到消息发送到 local0
只有当我更改为*.*
时,rsyslog 才会看到它:
*.* /var/log/local.log
我假设我没有在我的 python 脚本中正确配置该工具。
如何指定我要登录到local0
?
【问题讨论】:
你使用的是什么操作系统? @jdaz - 我正在使用 Debian。 在这里尝试@boatcoder 的答案:***.com/questions/3968669/… @400theCat 您的代码对我来说似乎运行良好。您是否在进行更改后重新启动了 rsyslog ?systemctl restart rsyslog
我也认为你错过了将实际命令行发送到日志文件syslog.syslog(syslog.LOG_WARNING, f"Message\n\n")
应该是syslog.syslog(syslog.LOG_WARNING, f"Message line\n\n")
【参考方案1】:
Rsyslog 和本地*:
Rsyslog 具有设施 local0
到 local7
,它们是 syslog 为用户提供的“自定义”未使用设施。如果开发人员创建了一个应用程序并希望将其记录到 syslog,或者如果您想将任何内容的输出重定向到 syslog(例如,Apache 日志),您可以选择将其发送到任何 local#
设施。然后,您可以使用/etc/syslog.conf
(或/etc/rsyslog.conf
)将发送到local#
的日志保存到文件中,或将其发送到远程服务器(source)。
配置:
/etc/rsyslog.conf
下
local0.* /var/log/local.log
这是正确的,它将日志文件 /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")
初始代码确实有效,正如 cmets 中指出的那样,this 可以用作替代方案,并且按照@apoorva-kamath 的建议添加了line
变量...
这里重要的一面是Python 脚本和Rsyslog 之间的通信。
正如命令 try 所指出的那样,重新加载 rsyslog systemctl restart rsyslog
;您也可以使用rsyslogd -N1
检查 Rsyslog 配置并检查 rsyslog 是否正常工作:
sudo cat /var/log/messages | grep rsyslog
根据 Python 脚本运行上下文,与 Rsyslog 的通信可能会失败,需要有关您的配置的更多详细信息,否则您可以尝试(从脚本的上下文):
logger -p local0.error "TroubleshootingTest"
最后检查数据传输:
sudo netstat -taupn | grep syslog
文档:
更多关于Python syslog、troubleshooting Rsyslog和Rsyslog facility的详细信息
【讨论】:
以上是关于从 python 脚本登录到 rsyslog 工具的主要内容,如果未能解决你的问题,请参考以下文章