我遇到一个问题,模块omprog
似乎rsyslog
没有使用参数来output
捕获脚本的输出到文件。我究竟做错了什么?
我的rsyslog
服务器每秒从外部主机接收十几条系统日志消息,并且我希望当任何消息满足特定条件时执行特定任务。因此,我编写了一个 Python 脚本来扫描特定条件stdin
并执行任务。 (此任务大约每隔几个小时触发一次。)对于所有其他消息,Python 脚本会丢弃该消息并继续侦听。当管道打开时,Python 脚本会无限运行。这一切都很完美。
stdout
然后,我在 Python 脚本中添加了一些确认消息,以便在启动时输出“已开始”消息,并stdout
在任务发生时输出“完成”消息。我将omprog
的confirmMessages
参数设置为off
,并将output
参数设置为 中的一个文件/var/log
。的输出getenforce
告诉我 SELinux 已关闭。当我重新启动时rsyslog
,永远不会创建该文件,并且永远不会捕获输出。
因此,我touch
以 syslog 用户身份编辑了该文件,然后重新启动rsyslog
,但这并不能解决问题。执行 asystemctl status rsyslog
表明 Python 脚本正在运行。当脚本看到特定消息时,我可以确认特定消息正在执行。
手动运行 Python 脚本确实会产生输出,并无限期地驻留在那里,直到我按Ctrl+ D。
我还配置了 Python 脚本输出,stderr
而不只是stdout
为了看看这是否会产生影响。重新启动后rsyslog
,仍然没有输出文件。
系统:Ubuntu 20.04.2 LTS
rsyslogd:version 8.2001.0
rsyslog配置:
module(load="omprog")
if $fromhost-ip == '10.200.25.5' then {
action(type="omfile"
file="/var/log/network")
action(type="omprog"
name="rsyslog_watch_vpn_attach"
binary="/usr/share/rsyslog/watch_syslog_vpn_attach.py"
confirmMessages="off"
output="/var/log/watch_vpn_attach.log")
stop
}
该/var/log/network
文件正在构建。该/var/log/watch_vpn_attach.log
文件未构建。
有谁知道我做错了什么?
答案1
这可能只是Python程序中缓冲的问题。一个简单的解决方案是确保添加flush=True
打印语句,例如:
#!/usr/bin/python3
import sys,time
for data in sys.stdin:
print(f"got data at {time.asctime()}: {data}",flush=True)