У меня странная проблема с rsyslog на некоторых из моих инстансов EC2 под управлением Amazon Linux 2012.3. После обновления yum rsyslog 4.6 до 5.8.10 кажется, что каждое сообщение журнала уровня INFO внезапно обрабатывается как проблема уровня EMERG, и они транслируются повсюду. Комментируя *.emerg *
из /etc/rsyslog.conf подавляет сообщения, но, очевидно, это не очень хорошее решение.
Сообщения выглядят так:
Message from syslogd@hostname at Jul 13 19:35:07 ...
¿<14>processname[1696]: INFO <yadayadayada>
Большая часть моего журнала поступает из регистратора Python 2.6 с logging.handler.SysLogHandler, конфигурацию которого я опубликовал ниже. Мне не удалось найти в Интернете какую-либо другую информацию об этой конкретной проблеме, и единственное, что, кажется, решает проблему для меня, - это откат к rsyslog 4.6, который мгновенно решает проблему. Это не трагедия, если я застрял на 4.6, но эта проблема очень сбивает с толку и заставляет меня задаться вопросом, неправильно ли я сконфигурировал что-то, что потребовалось, пока я не обновился, чтобы поднять голову.
Вот мой rsyslog.conf:
#### MODULES ####
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
#### GLOBAL DIRECTIVES ####
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf # this directory is empty
#### RULES ####
kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg *
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
А это конфигурация регистратора Python:
[handler_syslog]
formatter = syslog
class = handlers.SysLogHandler
args = ('/dev/log',handlers.SysLogHandler.LOG_USER)
level = INFO
[formatter_syslog]
format = %(name)s[%(process)d]: %(levelname)s %(message)s
Я не уверен, что предоставил достаточно информации по своему вопросу, и это первый раз, когда я размещаю сообщение о serverfault, поэтому приношу свои извинения за любые нарушения этикета. Большое спасибо.
Скорее всего, вы столкнулись с ошибка / ограничение SysLogHandler это приводит к тому, что спецификация вставлена не в том месте. Это сбивает с толку парсер rsyslog и приводит к тому, что сообщению присваивается приоритет EMERG.
Это было «исправлено» в Python 2.7 путем полного удаления вставки спецификации.
У вас есть два варианта:
Закодируйте сообщение в str
во время форматирования, чтобы обойти код вставки спецификации. Один из способов сделать это - реализовать небольшой настраиваемый модуль форматирования, например:
class BOMLessFormatter(logging.Formatter):
def format(self, record):
return logging.Formatter.format(self, record).encode('utf-8')