Регулярное выражение Rsyslog

Вопрос или проблема

У меня много входящих 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.

Шаги по реализации

  1. Определение регулярного выражения
    Для извлечения logtype из строки сообщения можно использовать следующее регулярное выражение:

    logtype:"([^"]+)"

    Данная конструкция позволяет захватывать текст между кавычками, что и является значением logtype.

  2. Создание правила с использованием 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
       }
    }
  3. Подключение входящих данных
    В зависимости от способа получения логов (по сети, из файла или другого источника), нужно указать правильный модуль для ввода, например:

    input(type="imtcp" port="12345" ruleset="stormshield")
  4. Обработка и управление потоком сообщений
    Используя оператор stop, вы предотвращаете продолжение обработки сообщения, если оно уже было записано в один из файлов. Это особенно важно, если у вас есть другие правила обработки логов в системе.

Заключение

С помощью Rsyslog и POSIX регулярных выражений вы можете эффективно фильтровать и направлять логи в зависимости от значений определённых полей, таких как logtype. Это приводит к лучшей организации данных и упрощает процесс анализа логов. Ваша система обработки логов станет более управляемой и понятной, что значительно упростит работу с большими объемами данных. Использование регулярных выражений в Rsyslog открывает множество возможностей для более гибкой настройки и обработки логов, позволяя вам справляться с любой сложной задачей, связанной с управлением журналами.

Оцените материал
Добавить комментарий

Капча загружается...