Python 日志记录数据报处理程序

标签 python logging handler datagram

我在获取 python 文档中显示的用于记录 DatagramHandler 的示例代码时遇到问题,下面显示的代码在收到的每个数据报上都会给出 EOFError 异常。

import socket
import logging
import cPickle
import struct
import sys

sock = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
sock.bind (('localhost', 9000))

handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter("UDP LogViewer %(asctime)s %(message)s"))
logger = logging.getLogger("Test")
logger.addHandler(handler)

try:
    while True:
        dgram_size = sock.recv(4)
        if len(dgram_size) < 4:
            break
        slen = struct.unpack(">L", dgram_size)[0]
        data = sock.recv(slen)

        while len(data) < slen:
            data = data + sock.recv(slen - len(data))

        try:
            obj = cPickle.loads(data)
            record = logging.makeLogRecord(obj)
            logger.handle(record)
        except:
            print "exception", sys.exc_info()[0]



finally:
    sock.close()

无论这段代码如何工作,有什么想法

data, address = sock.recvfrom(8192)
rec = logging.makeLogRecord(cPickle.loads(data[4:]))
logger.handle(rec)

问候

最佳答案

我希望您的第一个 recv(4) 调用会复制数据报中的前四个字节,然后将数据包的其余部分扔到地板上;第二次调用 recv 然后发现没有任何内容可读取并返回 EOFError。从我的系统的 udp(7) 联机帮助页:

   All receive operations return only one packet.  When the packet
   is smaller than the passed buffer, only that much data is
   returned; when it is bigger, the packet is truncated and the
   MSG_TRUNC flag is set.  MSG_WAITALL is not supported.

尝试读入整个数据报,获取前四个字节的长度,然后处理存储整个数据报的数组子集。

当然,如果你的泡菜不完全符合 MTU的连接,它可能永远不会按您的预期工作。

关于Python 日志记录数据报处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4397620/

相关文章:

python - 为错误编写不同的语句

python - 警告未找到 :/favicon. ico

python - 杀死线程不起作用

javascript - 元素输入上的 JQuery 自定义事件处理程序

python - django - 发布数据查询字典为空

c# - 设置 Serilog 以将日志写入 SQL Server 数据库表

linux - Linux 终端中带有颜色的 apache tomcat 输出

java - 如何解决 Groovy 与 Apache Common Logging 的冲突?

Javascript 调用 JSF 处理程序方法

android - 工作线程与主线程通信