Случайное полученное UDP-сообщение необходимо проанализировать в файле python через rsyslog omprog - PullRequest
0 голосов
/ 23 апреля 2019

Я устанавливаю скрипт на python, который будет анализировать входные данные, полученные через UDP от другого сервера. Поскольку сообщение или количество сообщений могут быть получены случайным образом, я пытаюсь rsyslog omprog для анализа входных данных. Однако я не могу прочитать сообщение по UDP и не могу отправить входные данные, полученные в качестве параметра, в python, используя omprog

Получение сообщения системного журнала от определенного сервера будет храниться в /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.

Я создал файл pcrf_scripting.conf в папке rsyslog.d

 [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 голосов
/ 24 апреля 2019

Этот минимальный пример сработал для меня (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.

...