我试图理解为什么 Python 日志框架 (logging.handlers) 中的 SyslogHandler 类没有实现 RFC 6587 描述的任何框架机制:

  • 八位字节计数 :它将消息长度“前置”到系统日志帧:
  • Non-Transparent-Framing :用于分隔消息的拖尾字符。这是大多数服务器所理解的。

  • 这个“问题”可以通过在消息的末尾添加一个 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'
    

    现在正在工作。

    我的问题:
  • Python SyslogHandler 类是否应该提供设置开/关八位字节计数或拖尾字符的可能性。目前它什么都不做...
  • 程序员的工作是了解服务器如何工作并覆盖处理程序以处理消息帧?

  • 现在,我现在要做的是覆盖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/

    10-10 04:45