需要通过rsyslog omprog

时间:2019-04-23 18:23:19

标签: python logging rsyslog

我正在设置一个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。

1 个答案:

答案 0 :(得分:0)

这个最小的示例对我有用(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