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

Как мне обрабатывать сообщения из моего пользовательского приложения в rsyslog?

У меня на сервере есть приложение Ruby, назовем его «альфа». Приложение выдает сообщения системного журнала с именем программы «альфа». Я хочу разделить свои сообщения журнала на отдельные файлы в зависимости от типа сообщения, например сообщения «auth» (логины) или предупреждения системных ресурсов.

У меня нет другого способа указать в системном журнале «тип сообщения», кроме имени моей программы, поэтому я просто добавляю «AUTH:», «SYSTEM:» и т. Д. В начале своего сообщения.

Используя Google и страницы руководства, я придумал следующие условия:

:programname,isequal,"alpha"           /var/log/alpha.log

Это регистрирует все сообщения от «альфа-приложения» в правильный файл журнала.

:msg,startswith," AUTH:"                /var/log/alpha-auth.log

Это регистрирует все сообщения, начинающиеся с «AUTH:», в правильный файл журнала.

Очевидно, последнее условие применяется не только к «альфе», но и ко всем сообщениям. Я хотел бы объединить эти условия в одно, которое гласит: «все сообщения от альфы, начинающиеся с AUTH: ...». Можно ли комбинировать фильтры с "и" вот так?

«Блоки в стиле BSD» кажутся идеальными, поскольку я могу определить блок для своего приложения, и все условия применяются только к сообщениям от этого приложения. К сожалению, согласно документам эта функция больше не поддерживается (устарело?), и я не хочу полагаться на устаревшую функцию. Предлагает ли rsyslog v7 + альтернативу таким блокам?

Используя фильтр на основе выражений, мне удалось получить желаемый результат, но я чувствую, что использую базуку, чтобы убить муху:

if $programname == "alpha" and $msg startswith " AUTH:" then \
    /var/log/alpha-auth.log

Каким будет «правильный» (т.е. самый простой и наименее подверженный ошибкам) ​​способ сделать это?


Я использую Debian Jessie, что в настоящее время означает rsyslog 8.4.2

Сначала создайте файл конфигурации в /etc/rsyslog.d, например 01-alpha.conf, чтобы все было организовано. Таким образом, ваш 01-alpha.conf будет прочитан первым, чем 50-default.conf. В 50-default.conf есть правило записывать все в / var / log / syslog, поэтому в этом примере мы будем отбрасывать сообщение после записи его в журналы альфа-версии.

В 01-alpha.conf:

:programname, isequal, "alpha" {
  *.* /var/log/alpha.log
  :msg, startswith, "AUTH:" {
    *.* /var/log/alpha-auth.log
  }
  stop
}

Сообщение входит в этот фильтр только в том случае, если имя программы альфа, тогда оно войдет в /var/log/alpha.log. Если это журнал аутентификации, записывает его в /var/log/alpha-auth.log. В конце концов, отбросьте сообщение, чтобы оно не было записано в другом месте.