У меня на сервере есть приложение 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. В конце концов, отбросьте сообщение, чтобы оно не было записано в другом месте.