我在运行Amazon Linux 2012.3的一些EC2实例上遇到了rsyslog的奇怪问题。 在yum升级rsyslog 4.6到5.8.10之后,似乎每个INFO级别的日志消息突然被当作EMERG级别的问题处理,并且他们正在到处广播。 从/etc/rsyslog.conf中注释掉*.emerg *压制这些消息,但显然这不是一个很好的解决scheme。
消息看起来像这样:
Message from syslogd@hostname at Jul 13 19:35:07 ... ¿<14>processname[1696]: INFO <yadayadayada>
我的大部分日志logging都来自一个Python 2.6logging器,带有一个logging.handler.SysLogHandler,我在下面发布了它的configuration。 我没有find任何关于这个具体问题的其他信息在网上,唯一似乎解决了这个问题是我回滚到rsyslog 4.6,即刻解决问题。 如果我坚持4.6,这不是一个悲剧,但是这个问题是非常令人不安的,并且让我怀疑我是否错误地configuration了一些刚刚更新的东西,直到我更新为止。
这是我的rsyslog.conf:
#### MODULES #### $ModLoad imuxsock # provides support for local system logging (eg 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
这是Pythonlogging器的configuration:
[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的bug /限制 ,导致BOM被插入错误的地方。 这混淆了rsyslogparsing器,并导致该消息归因于EMERG优先。
这已经在Python 2.7中“固定”了,通过完全删除BOM插入。
你有两个select:
在格式化过程中将消息编码为str以解决BOM插入代码。 一种做法是实现一个像这样的小型自定义格式化器:
class BOMLessFormatter(logging.Formatter): def format(self, record): return logging.Formatter.format(self, record).encode('utf-8')