Amazon Linux 上的 rsyslog 更新突然将 INFO 级别消息视为 EMERG

Amazon Linux 上的 rsyslog 更新突然将 INFO 级别消息视为 EMERG

我在运行 Amazon Linux 2012.3 的某些 EC2 实例上遇到了 rsyslog 的奇怪问题。使用 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>

我的大部分日志记录来自带有logging.handler.SysLogHandler的Python 2.6记录器,我已将其配置发布在下面。我在网上找不到有关此特定问题的任何其他信息,似乎唯一能为我解决问题的方法就是回滚到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 上发帖,因此对于任何违反礼仪的行为,我深表歉意。非常感谢。

答案1

你很可能遇到SysLogHandler 的错误/限制这会导致 BOM 插入到错误的位置。这会使 rsyslog 解析器混乱,并导致该消息被赋予 EMERG 优先级。

Python 2.7 中已通过完全删除 BOM 插入来“修复”此问题。

您有两个选择:

  1. 升级到 Python 2.7
  2. 在格式化期间将消息编码str为 BOM 插入代码。一种方法是实现一个小型自定义格式化程序,如下所示:

    class BOMLessFormatter(logging.Formatter):
        def format(self, record):
          return logging.Formatter.format(self, record).encode('utf-8')
    

相关内容