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

Modified on: Sat, 12 Oct 2019 15:20:02 +0800

我在运行Amazon Linux 2012.3的一些EC2实例上遇到了rsyslog的奇怪问题。
当yum将rsyslog 4.6升级到5.8.10时,似乎每个INFO级别的日志消息都会被突然视为EMERG级别问题,并且它们随处可见。从/etc/rsyslog.conf注释掉*.emerg *会压制消息,但显然这不是一个解决方案。

消息如下所示:

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

我不确定我是否提供了有关我的问题的足够信息,这是我第一次发布服务器故障,所以我对任何违反礼仪的行为表示歉意。
非常感谢。

作者:slucidi

最佳答案

很可能您遇到了SysLogHandler的错误/限制导致插入的BOM错误的地方。这会混淆rsyslog解析器,并导致消息被归为EMERG优先级。

通过完全删除BOM插入,这已在Python 2.7中“修复”。

您有两种选择:

  1. 升级到Python 2.7
  2. 在格式化过程中将消息编码到str中以解决BOM插入代码的问题。一种方法是实现这样的小型自定义格式化程序:

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

相关问答

添加新评论