У меня есть несколько разных приложений django под apache на сервере Red Hat. Эти приложения используют SysLogHandler для отправки сообщений журнала на локальный rsyslog
служба. Чтобы передавать сообщения журнала из разных приложений django в разные файлы, мы используем rsyslog tagging
(на основе syslogtag
). Вот что у нас есть /etc/rsyslog.conf
:
...
$template myFormat,"%msg%\n"
if $syslogfacility-text == 'local2' and $syslogtag == 'dev:' then /var/log/ap/dev/ws.log;myFormat
if $syslogfacility-text == 'local2' and $syslogtag == 'rel:' then /var/log/ap/rel/ws.log;myFormat
...
Работает так: если сообщение журнала dev:Hello World!
, Hello World!
написано /var/log/ap/dev/ws.log
.
До вчерашнего дня все работало нормально. Наша система обновлена с 6.2 до 6.3. В соответствии с yum history
, rsyslog
был обновлен с 4.6.2-12
к 5.8.10-2
версия.
После небольшой отладки я обнаружил, что $syslogtag == 'dev:'
состояние не работает на новом rsyslog
версия. $syslogtag
теперь ест часть сообщения до первого пробела и содержит dev:Hello
вместо просто dev:
.
Не могли бы вы указать мне, что с этим делать и как заставить rsyslog правильно разбирать тег? (Изменение формата сообщения журнала, поступающего из приложений django, не является вариантом)
Дайте мне знать, если вам понадобится дополнительная информация. Спасибо.
Я давно мигрировал, но считаю, что вам стоит использовать
$syslogtag startswith 'rel: '
вместо ==
Если у приложений разные имена, вы можете использовать фильтр $ programname.
Если нет, вы можете использовать if $msg contains 'rel: ' then ....
Я бы посоветовал посмотреть на http://www.rsyslog.com/doc/rsyslog_conf_filter.html
Спасибо другим ответам за помощь в создании if
состояние работы но проблема в том, что $msg
не содержит фактического сообщения журнала, отправленного из приложения, поскольку $syslogtag
"съедает" часть сообщения до первого пробела в нем.
В качестве обходного пути я могу изменить шаблон журнала и объединить недостающую часть сообщения из %syslogtag%
и %msg%
:
$template myFormat,"%syslogtag:F,58:2%%msg%\n"
Он принимает участие %syslogtag%
после двоеточия (код ascii 58) и добавляет %msg%
после.
К счастью, это работает как для 4.6.2-12
и 5.8.10-2
версии rsyslog. Но я не думаю, что это красивое и чистое решение, больше похоже на взлом. Кроме того, я не уверен, что это сработает в будущих версиях rsyslog.
Надеюсь, будут другие ответы или комментарии.