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 上发帖,所以我对任何违反礼仪的行为表示歉意。非常感谢。
您很可能遇到SysLogHandler 的错误/限制,导致 BOM 插入错误的位置。这会混淆 rsyslog 解析器,并导致消息被赋予 EMERG 优先级。
通过完全删除 BOM 插入,这个问题已在 Python 2.7 中得到“修复”。
您有两个选择:
将消息编码为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) 归档时间: |
|
查看次数: |
1047 次 |
最近记录: |