我在运行 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 插入来“修复”此问题。
您有两个选择:
- 升级到 Python 2.7
在格式化期间将消息编码
str
为 BOM 插入代码。一种方法是实现一个小型自定义格式化程序,如下所示:class BOMLessFormatter(logging.Formatter): def format(self, record): return logging.Formatter.format(self, record).encode('utf-8')