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

slu*_*idi 5 python logging amazon-ec2 rsyslog

我在一些运行 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>
Run Code Online (Sandbox Code Playgroud)

我的大部分日志记录来自带有 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
Run Code Online (Sandbox Code Playgroud)

这是 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
Run Code Online (Sandbox Code Playgroud)

我不确定我是否提供了足够的关于我的问题的信息,这是我第一次在 serverfault 上发帖,所以我对任何违反礼仪的行为表示歉意。非常感谢。

Dam*_*oud 4

您很可能遇到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')
    
    Run Code Online (Sandbox Code Playgroud)