【发布时间】:2019-04-23 18:23:18
【问题描述】:
我正在设置一个 python 脚本,它将解析通过 UDP 从另一台服务器接收到的输入。由于可以随机接收消息或消息数量,因此我尝试使用 rsyslog omprog 来解析输入。但是,我无法读取 UDP 上的消息,也无法使用 omprog 将作为参数接收的输入发送到 python
从特定服务器接收 syslog 消息将存储在 /var/log/pcrf_notification.log 因此,我将 rsyslog.conf 配置如下:
[root@PORSG1NT101A]# vi /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$template RemoteLogs,"/var/log/%HOSTNAME%/pcrf_notification.log"
*.* ?RemoteLogs
pcrf_notification.log 的内容是:
Mar 15 16:27:30 PORPF0MP1 Policy Syslog: 5540149665,123,5000001,2019-03-15T16:27:30.290
Mar 15 16:27:52 PORPF0MP1 Policy Syslog: 5540149665,123,5000001,2019-03-15T16:27:52.895
现在我需要将收到的每一行发送到 python 脚本。这是我失败的地方。
比如我需要发送
"Mar 15 16:27:52 PORPF0MP1 Policy Syslog: 5540149665,123,5000001,2019-03-15T16:27:52.895"
到 python 脚本。
我在 rsyslog.d 文件夹中创建了一个 pcrf_scripting.conf 文件
[root@PORSG1NT101A rsyslog.d]# vi /etc/rsyslog.d/pcrf_scripting.conf
$ModLoad omprog
:inputname, isequal, "imudp" action(type="omprog"
binary="/tmp/hello.py --param1 a --param2 b"
template="RSYSLOG_TraditionalFileFormat")
我需要用每一行替换 --param1 a --param2 b。
【问题讨论】:
-
omprog 并不打算为每条输入消息运行不同的命令。通常,它运行一个程序,然后将每条消息发送到该程序的标准输入。
-
是的@meuh。这就是我想要达到的目标。将每条消息发送到该程序的输入(在我的例子中是 python 脚本)。你能帮我看看吗
-
也许你没有包含第二个conf文件?确保在文件
/etc/rsyslog.conf中有行$IncludeConfig /etc/rsyslog.d/*.conf。否则你的conf似乎没问题。你必须让你的hello.py做类似sys.stdin.readline()的事情才能得到每一行。 -
那么我可以在我的 pcrf.conf 文件中使用 rsyslog.d/ 文件夹模块(load="omprog") action(type="omprog" binary="/tmp/hello.py %msg % template="RSYSLOG_TraditionalFileFormat")
-
我不知道这是否可行,但您的
hello.py在每条消息后都必须退出,这将非常低效。我已经发布了一个答案,其中程序启动一次并永远运行,读取标准输入。