Назад | Перейти на главную страницу

Возможность / степень перезаписи в rsyslog v7 перед отправкой удаленному сборщику

У меня есть машина «A» с локальным rsyslogd и удаленная машина-сборщик «B» в другом месте, прослушивающая свой собственный демон syslog и механизм обработки журналов. Все работает отлично ... за исключением того, что в A есть один процесс, который регистрируется в local0.notice, что не может обработать движок B.

Я хочу переписать local0.notice в local5.info до того, как событие будет отправлено в B. К сожалению, я не могу изменить B и не могу изменить способ регистрации процесса в A. Я также не могу обновить rsyslogd на A от v7.6 до v8 (который, кажется, имеет некоторые очень полезные функции, такие как mmexternal, которые могли бы помочь).

Я думаю, что мне не хватает чего-то очевидного, я не могу быть первым, кому нужна такая функция. В основном это сводится к поиску способа дважды пройти через rsyslog с фильтром между ними: один раз, когда процесс регистрирует, через фильтр, чтобы изменить приоритет, а затем снова, чтобы переслать его.

Что я пробовал:

Есть ли какие-нибудь решения?

Поработав с syslog-ng, я считаю, что вы можете делать то, что ищете, используя его в качестве основного демона системного журнала на «Хосте A», и пересылать ваше измененное сообщение на «Хост B». Однако, поскольку вам нужно переписать «жестко запрограммированные» флаги сообщений, вам необходимо отключить собственный синтаксический анализ полей syslog-ng, чтобы вы могли применить регулярное выражение к необработанному сообщению syslog (протоколу).

Вы обнаружите, что Syslog-NG имеет очень мощный подход к обработке сообщений, в общем, прочитав https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/chapter-manipulating-messages.html

Прочитав это, вы увидите, что, к сожалению, вам, вероятно, придется отключить собственный синтаксический анализ сообщений системного журнала Syslog-NG и работать с необработанными данными, установив следующий параметр в syslog-ng.conf:

flags(no-parse)

Это может вызвать проблемы. Например, вы больше не будете получать многострочные сообщения системного журнала как «одно сообщение», потому что syslog-ng необходимо проанализировать сообщение, чтобы понять, что это одно сообщение.

Ссылка: https://en.wikipedia.org/wiki/Syslog-ng

Это скорее взлом, чем решение, но мне не удалось найти «чистый» способ решить вашу проблему:

Полезная нагрузка пакета UDP для сообщений local0.notice всегда будет начинаться со значения <133> (16 * 8 + 5 согласно rfc3164), в то время как local5.info отображается на <174> (21 * 8 + 6).

Вы можете использовать nfqueue + scapy на A, чтобы переписать все вхождения <133> в <174> при отправке пакетов по сети, и B будет получать и регистрировать сообщения local5.info вместо local0.notice.

Все остальные UDP-пакеты системного журнала не будут затронуты и будут регистрироваться в обычном режиме.

Простой пример: https://byt3bl33d3r.github.io/using-nfqueue-with-python-the-right-way.html

RFC: https://www.ietf.org/rfc/rfc3164.txt

Скрипт для табличных значений PRI: http://www.digitalprognosis.com/opensource/scripts/syslog-priorities.py