Вход в средство rsyslog из скрипта Python

У меня в /etc/rsyslog.conf есть:

local0.*     /var/log/local.log

И у меня есть простой скрипт python, который читает со стандартного ввода и должен отправлять local0

#!/usr/bin/python3

import sys, syslog

syslog.openlog(ident="MY_SCRIPT", facility=syslog.LOG_LOCAL0)

for line in sys.stdin:
    syslog.syslog(syslog.LOG_WARNING, f"Message\n\n")

Но это не работает. rsyslog не считает, что сообщения поступают на local0

Только когда я перехожу на *.*, rsyslog видит это:

*.*     /var/log/local.log

Я предполагаю, что неправильно настроил средство в моем скрипте Python.

Как я могу указать, что хочу войти в local0?


person 400 the Cat    schedule 31.05.2020    source источник
comment
Какую ОС вы используете?   -  person jdaz    schedule 02.06.2020
comment
@jdaz - я использую Debian.   -  person 400 the Cat    schedule 02.06.2020
comment
Попробуйте ответ @bootcoder здесь: stackoverflow.com/questions/3968669/   -  person jdaz    schedule 02.06.2020
comment
@ 400theCat, похоже, ваш код у меня работает нормально. вы перезапустили rsyslog после внесения изменений? systemctl restart rsyslog   -  person apoorva kamath    schedule 02.06.2020
comment
также я думаю, что вы пропустили отправку фактической командной строки в файл журнала syslog.syslog(syslog.LOG_WARNING, f"Message\n\n") должно быть syslog.syslog(syslog.LOG_WARNING, f"Message {line}\n\n")   -  person apoorva kamath    schedule 02.06.2020


Ответы (1)


Rsyslog и локальный *:

Rsyslog имеет возможности от local0 до local7, которые являются «настраиваемыми» неиспользуемыми функциями, которые syslog предоставляет пользователю. Если разработчик создает приложение и хочет, чтобы оно регистрировалось в системном журнале, или если вы хотите перенаправить вывод чего-либо в системный журнал (например, журналы Apache), вы можете отправить его на любое из local# объектов. Затем вы можете использовать /etc/syslog.conf (или /etc/rsyslog.conf) для сохранения журналов, отправляемых на этот local#, в файл или для отправки его на удаленный сервер (источник).

Конфигурация:

Меньше /etc/rsyslog.conf

local0.*     /var/log/local.log

Это правильно, и он назначает файл журнала /var/log/local.log приложениям, которые регистрируются на local0. В качестве другого примера можно использовать kern.=warn -/var/log/kernel/warnings.log для регистрации предупреждений ядра.

Приложение / скрипт Python:

#!/usr/bin/python3
import sys, syslog

syslog.openlog(ident="MY_SCRIPT", facility=syslog.LOG_LOCAL0)

for line in sys.stdin:
    syslog.syslog(syslog.LOG_WARNING, f"Message {line}\n\n")

Исходный код действительно работает, и, как указано в комментариях, это может использоваться как альтернатива, и переменная {line} была добавлена ​​в соответствии с предложением @ apoorva-kamath ...

Важная сторона здесь - это связь между скриптом Python и Rsyslog.

Также, как указано в команде, попробуйте перезагрузить rsyslog systemctl restart rsyslog; вы также можете проверить конфигурацию Rsyslog с помощью rsyslogd -N1 и проверить, правильно ли работает rsyslog с помощью:

sudo cat /var/log/messages | grep rsyslog

В зависимости от контекста выполнения скрипта Python связь с Rsyslog может завершиться ошибкой, требуются дополнительные сведения о вашей конфигурации, в противном случае вы можете попробовать (из контекста скрипта):

logger -p local0.error "TroubleshootingTest"

И, наконец, проверьте передачу данных с помощью:

sudo netstat -taupn | grep syslog

Документация:

Дополнительные сведения о системном журнале Python, устранение неполадок Rsyslog и Средство Rsyslog

person intika    schedule 02.06.2020