我试图理解为什么 Python 日志框架 (logging.handlers) 中的 SyslogHandler 类没有实现 RFC 6587 描述的任何框架机制:
这个“问题”可以通过在消息的末尾添加一个 LF 字符来轻松解决,但是我希望 SyslogHandler 默认会处理这个问题:
sHandler = logging.handlers.SysLogHandler(address=(address[0], address[1]), socktype = socket.SOCK_STREAM)
sHandler.setFormatter(logging.Formatter(fmt=MSG_SYSLOG_FORMAT, datefmt=DATE_FMT))
self.addHandler(sHandler)
这既不适用于 Fluentd,也不适用于 rsyslog。正如我所说,我暂时将它添加到 handlers.py 的第 855 行(只是为了测试):
msg = prio + msg + '\n'
现在正在工作。
我的问题:
现在,我现在要做的是覆盖emit() 方法,子类化SyslogHandler。
最佳答案
logging
中的 Syslog 支持早于 RFC,在 RFC 之前,几乎没有标准。
准确地说:SysLogHandler
处理程序在 first added to the Python standard library in 2002 时是 logging
的一部分,并且从那时起基本保持不变(TCP 支持是 added in 2009 ,RFC5424 支持在 2011 年得到改进);原始代码基于 this syslog
module from 1997 。
从 other bug reports 很明显,维护者希望在此处的代码中保持最广泛的向后兼容性,因此如果您需要来自较新 RFC 的特定功能,您有两个选择:
logging
模块中的功能;考虑向后兼容性要求。 关于Python 的 SyslogHandler 和 TCP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40041697/