我正在设置一个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。
这个最小的例子对我有用(rsyslogd版本8.30.0)。在/etc/rsyslog.conf
,我们有
$ModLoad imudp # UDP listener
$UDPServerRun 514
$ModLoad omprog
:inputname, isequal, "imudp" action(type="omprog"
binary="/tmp/prog.py" template="RSYSLOG_TraditionalFileFormat")
在/tmp/prog.py
,我们有
#!/usr/bin/python3
import sys
with open("/tmp/output","w",encoding='utf8',errors='ignore') as fd:
for data in sys.stdin:
print("got data: %s" % data[:-1], file=fd, flush=True)
当一个udp数据包到达时,它会被传递给python程序,然后将其打印到文件/tmp/output
。一定要chmod a+rx /tmp/prog.py
。