Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python2.7错误地使用TCP聚合系统日志消息,在UDP中工作正常_Python_Logging_Tcp_Udp_Syslog - Fatal编程技术网

Python2.7错误地使用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 …然后事情开始变得奇怪。一行

使用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
…然后事情开始变得奇怪。一行代码是从已知良好代码复制问题所需的唯一代码更改

以下是我获取日志处理程序的方式:

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_)