【问题标题】:Random UDP message received needs to be parsed to python file through rsyslog omprog接收到的随机UDP消息需要通过rsyslog omprog解析成python文件
【发布时间】: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 在每条消息后都必须退出,这将非常低效。我已经发布了一个答案,其中程序启动一次并永远运行,读取标准输入。

标签: python logging rsyslog


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2012-08-05
    • 2012-12-12
    相关资源
    最近更新 更多