Вопрос или проблема
У меня много входящих syslog
сообщений на моем сервере rsyslog
. Это stormshield
, который отправляет сообщения разных категорий (соединение, веб, тревога и т. д.)
Я не могу настроить разные источники для каждой категории, поэтому мне нужно использовать регулярное выражение, чтобы разбить входящие сообщения на разные файлы.
Все сообщения разные и имеют больше или меньше полей в сообщении, но есть одно поле logtype
для идентификации категории:
Syslog сообщение
Msg = bullshitcontentbullshitcontent logtype:"connection" bullshitcontentbullshitcontent
Так что вопрос в следующем:
Как я могу получить строку из поля logtype
с помощью POSIX регулярного выражения, которое понимается rsyslog
, и – если вы знаете как – разбить на разные файлы в зависимости от значения logtype
?
Я знаю, что это немного поздно, но это возможно. Я не знаю, как вы получаете эти логи (быстрый поиск предполагает сеть, возможно), но у меня есть подобная настройка. Вы можете использовать наборы правил, чтобы создать (что смешно) новые наборы правил, которые не используются по умолчанию. А в встроенном языке сценариев RainerScript есть функция re_match
, которая возвращает true или false.
ruleset(name="stormshield") {
if re_match($msg, "ваше POSIX ERE регулярное выражение") then {
action(type="omfile" file="/ваш/файл/имя/здесь")
stop
} else if re_match(...) then { ... }
else { ... }
}
$msg
— это ссылка на текущий лог.
omfile
предназначен для модуля вывода, так что если вам нужны базы данных или что-то еще, есть и другие варианты.
И как только вы закончите с if..else if...else
, другие вещи могут идти туда. stop
нужен, чтобы отбрасывать сообщение после его обработки, иначе оно тоже будет идти к другим правилам. Я думаю, вы можете добавить тильду ~
после действия тоже для этого, но вам придется проверить.
То, как направить логи к набору правил (привязать
к нему, как сказано в документации), зависит от источника. Для сетевых или файловых источников есть функция input
и входные модули, такие как "imtcp"
и "imfile"
с параметром набора правил. Возможно, вам придется получить дополнительные пакеты для некоторых модулей:
input(type="imfile" File="/input/file/here.log" Tag="..." Ruleset="имя набора правил")
input(type="imtcp" Port="1234" Name="name" Ruleset="имя набора правил")
И, наконец, если вам нужно отправить конкретный источник, вы можете использовать call
: local0.* call rulesetName
(без кавычек для имени, кажется), например (выберите, что нужно логировать по мере необходимости)
Я думаю, у меня это все в порядке. Я только что смотрел конфигурационные файлы, так что извините за ошибки..
Ответ или решение
Использование регулярных выражений в Rsyslog для обработки сообщений Syslog
Введение
Система Rsyslog является мощным инструментом для управления логами в реальном времени. В ситуациях, когда необходимо обрабатывать большое количество входящих сообщений Syslog, использование регулярных выражений для фильтрации и организации данных может быть очень полезным. В данном руководстве мы рассмотрим, как с помощью POSIX регулярных выражений можно извлекать поле logtype
из сообщений и направлять их в различные файлы в зависимости от его значения.
Задача
У вас есть система, отправляющая различные виды сообщений (например, connection
, web
, alarm
и т. д.), где каждое сообщение выглядит примерно так:
Msg = bullshitcontentbullshitcontent logtype:"connection" bullshitcontentbullshitcontent
К сожалению, вы не можете настроить различные категории (facility) для каждого типа лога, но вам нужно отделять их в разные файлы на вашем сервере Rsyslog.
Шаги по реализации
-
Определение регулярного выражения
Для извлеченияlogtype
из строки сообщения можно использовать следующее регулярное выражение:logtype:"([^"]+)"
Данная конструкция позволяет захватывать текст между кавычками, что и является значением
logtype
. -
Создание правила с использованием RainerScript
Вам необходимо создать набор правил, используя язык RainerScript, который позволяет использовать функции и условия для обработки логов. Основная структура правил будет выглядеть следующим образом:ruleset(name="stormshield") { if re_match($msg, "logtype:\"([^\"]+)\"") then { set $logtype = re_replace($msg, ".*logtype:\"([^\"]+)\".*", "$1"); if $logtype == "connection" then { action(type="omfile" file="/var/log/rsyslog/connection.log") } else if $logtype == "web" then { action(type="omfile" file="/var/log/rsyslog/web.log") } else if $logtype == "alarm" then { action(type="omfile" file="/var/log/rsyslog/alarm.log") } stop } }
-
Подключение входящих данных
В зависимости от способа получения логов (по сети, из файла или другого источника), нужно указать правильный модуль для ввода, например:input(type="imtcp" port="12345" ruleset="stormshield")
-
Обработка и управление потоком сообщений
Используя операторstop
, вы предотвращаете продолжение обработки сообщения, если оно уже было записано в один из файлов. Это особенно важно, если у вас есть другие правила обработки логов в системе.
Заключение
С помощью Rsyslog и POSIX регулярных выражений вы можете эффективно фильтровать и направлять логи в зависимости от значений определённых полей, таких как logtype
. Это приводит к лучшей организации данных и упрощает процесс анализа логов. Ваша система обработки логов станет более управляемой и понятной, что значительно упростит работу с большими объемами данных. Использование регулярных выражений в Rsyslog открывает множество возможностей для более гибкой настройки и обработки логов, позволяя вам справляться с любой сложной задачей, связанной с управлением журналами.