Фильтры в rsyslog
В Debian Lenny заменили системный демон логирования syslog на более продвинутый rsyslog. Одно из его преимуществ, называемое фильтрацией, мне понравилось особенно сильно. Давайте рассмотрим его на примере:
Мне нужно было разделить по разным файлам почтовые логи сервера smtp (postfix) от логов pop3/imap сервера dovecot.
Сначала посмотрим в лог, чтобы определить как отличаются логи сервиса dovecot от остальных:
May 14 20:50:03 host dovecot: IMAP(username): Disconnected: Logged out May 14 20:51:48 host dovecot: auth(default): new auth connection: pid=9216
Оказывается, все они обязательно начинаются со слова 'dovecot:'. Хорошо, теперь откроем файл /etc/rsyslog.conf и найдём строки, отвечающие за почтовые сообщения:
# # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # # закомментируем следующую строку... #mail.=info -/var/log/mail/mail.info # и заменим её своей, которая делает то же самое что и закомментированная, # но пропускает (не логирует) сообщения от dovecot: if $syslogfacility-text == 'mail' and $syslogpriority-text == 'info' and \ not ($syslogtag startswith 'dovecot:') then /var/log/mail/mail.info # следующие две строки оставляем как есть, т.к. обычно давкот туда не пишет mail.=warn -/var/log/mail/mail.warn mail.=err /var/log/mail/mail.err # снова закомментируем строку и заменим её на свою: #mail.* /var/log/mail/mail.all if $syslogfacility-text == 'mail' and \ not ($syslogtag startswith 'dovecot:') then /var/log/mail/mail.all
После этого просто добавим туда же полностью свои строки, которые будут отвечать за логирование давкотовских сообщений:
# # Logging the dovecot's messages # # логирование всех-всех сообщений от dovecot в один файл... :syslogtag, startswith, "dovecot:" /var/log/mail/dovecot.all # и в разные файлы с разделением по приоритетам: if $syslogfacility-text == 'mail' and $syslogpriority-text == 'info' \ and $syslogtag startswith 'dovecot:' then /var/log/mail/dovecot.info if $syslogfacility-text == 'mail' and $syslogpriority-text == 'err' \ and $syslogtag startswith 'dovecot:' then /var/log/mail/dovecot.err if $syslogfacility-text == 'mail' and $syslogpriority-text == 'warn' \ and $syslogtag startswith 'dovecot:' then /var/log/mail/dovecot.warn
Вот и всё, перезагружаем правила командой:
$ /etc/init.d/rsyslog reload, смотрим на всякий случай в файл /var/log/syslog (по умолчанию в debian lenny туда попадают сообщения об ошибках от самого rsyslog) и радуемся :)
Более подробно об этой и других новомодных фишках этого логера можно прочитать (на английском) здесь: Filter Conditions, а начать полное изучение всех его возможностей можно отсюда: RSyslog - Documentation.
- 4757 просмотров
Страница для печати

Спасибо за пояснения, как раз нужно было по 2-м событиям фильтровать
syslog-ng тоже имеет подобную возможность....
Спасибо, не знал :)
Отправить комментарий