Python2.7错误地使用TCP聚合系统日志消息,在UDP中工作正常
使用LinuxMint19.1附带的Python2.7.15rc1,我将一些数据系统记录到rsyslog 8.32.0-1ubuntu4。通过TCP这样做会错误地将多个日志消息连接到/var/log/syslog中的一行,而UDP不会正确地进行此聚合 为了可靠性,我想使用TCP而不是UDP,但我需要非链接输出 如果我将程序中的一行更改为:Python2.7错误地使用TCP聚合系统日志消息,在UDP中工作正常,python,logging,tcp,udp,syslog,Python,Logging,Tcp,Udp,Syslog,使用LinuxMint19.1附带的Python2.7.15rc1,我将一些数据系统记录到rsyslog 8.32.0-1ubuntu4。通过TCP这样做会错误地将多个日志消息连接到/var/log/syslog中的一行,而UDP不会正确地进行此聚合 为了可靠性,我想使用TCP而不是UDP,但我需要非链接输出 如果我将程序中的一行更改为: socktype = socket.SOCK_DGRAM …致: socktype = socket.SOCK_STREAM …然后事情开始变得奇怪。一行
socktype = socket.SOCK_DGRAM
…致:
socktype = socket.SOCK_STREAM
…然后事情开始变得奇怪。一行代码是从已知良好代码复制问题所需的唯一代码更改
以下是我获取日志处理程序的方式:
handler = logging.handlers.SysLogHandler(address=address, socktype=socktype)
良好情况下(使用UDP)的日志消息如下(例如):
坏情况下的日志消息(使用TCP)如下所示(例如):
我认为这件事发生得太多了,不能成为一件唠叨的事
关于TCP和UDP,我喜欢TCP的可靠性,我喜欢当它不工作时,会出现异常,而不仅仅是丢弃消息
另外:我知道Python2.x很快就会不受支持,但这段代码在2.x上的使用时间会更长。重复链接的可能重复也会链接到标记为非错误的Python错误问题。很遗憾,这看起来有点像。遗憾的是,我认为继承SysLogHandler并重写emit方法有点难看。我相信我必须使用UDP。msg+'\n'的建议听起来很有希望。遗憾的是,它对我不起作用。请尝试在对问题的评论中给出的替代方法
msg=str(len(msg))+''+msg
。这会将消息的长度放在消息的开头,然后在消息的开头加上一个空格。重复链接的可能重复也会链接到标记为非错误的Python错误问题。这看起来有点像。遗憾的是,我认为继承SysLogHandler并重写emit方法有点难看。我相信我必须使用UDP。msg+'\n'的建议听起来很有希望。遗憾的是,它对我不起作用。请尝试在对问题的评论中给出的替代方法msg=str(len(msg))+''+msg
。这会将消息的长度然后在消息的开头放置一个空格。
Jun 11 15:59:25 2019-06-11 15: 59:25,870|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading xgb_factory
Jun 11 15:59:25 2019-06-11 15: 59:25,871|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading lgb_factory
Jun 11 15:59:25 2019-06-11 15: 59:25,871|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading rf_factory
Jun 11 15:59:39 2019-06-11 15: 59:39,161|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading xgb_factory
Jun 11 15:59:39 2019-06-11 15: 59:39,161|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading lgb_factory
Jun 11 15:59:39 2019-06-11 15: 59:39,162|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading rf_factory
Jun 11 11:55:04 2019-06-11 11: 53:43,139|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading xgb_factory#000<14>2019-06-11 11:53:43,140|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading lgb_factory#000<14>2019-06-11 11:53:43,141|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading rf_factory#000<14>2019-06-11 11:53:57,842|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading xgb_factory#000<14>2019-06-11 11:53:57,843|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading lgb_factory#000<14>2019-06-11 11:53:57,843|_|INFO|_|dstromberg-inspiron-5570|_|domain.classifier.factories.classifier_academy|_|classifier_academy.py|_|load|_|132|_|loading rf_factory
class ContainerFilter(logging.Filter):
"""This is a filter that just adds the container name (hostname)."""
def __init__(self, name='', container_id=None):
"""Initialize."""
super(ContainerFilter, self).__init__(name)
self.container_id = container_id
def filter(self, record):
"""Set record's metric and container_id attributes, if available."""
record.container = self.container_id
return True
filter_ = ContainerFilter(container_id=_DOCKER_CONTAINER_ID)
handler.addFilter(filter_)