omprog 不会将脚本输出捕获到文件

omprog 不会将脚本输出捕获到文件

我遇到一个问题,模块omprog似乎rsyslog没有使用参数来output捕获脚本的输出到文件。我究竟做错了什么?

我的rsyslog服务器每秒从外部主机接收十几条系统日志消息,并且我希望当任何消息满足特定条件时执行特定任务。因此,我编写了一个 Python 脚本来扫描特定条件stdin并执行任务。 (此任务大约每隔几个小时触发一次。)对于所有其他消息,Python 脚本会丢弃该消息并继续侦听。当管道打开时,Python 脚本会无限运行。这一切都很完美。

stdout然后,我在 Python 脚本中添加了一些确认消息,以便在启动时输出“已开始”消息,并stdout在任务发生时输出“完成”消息。我将omprogconfirmMessages参数设置为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)

相关内容