UDP 服务器中从记录器发送的 Unpickling 数据导致 EOFError

Unpickling data in UDP server send from logger results in EOFError

我在对从记录器接收到的数据进行 unpickling 时遇到了一些问题。给定 udp_server:

import pickle
import logging
import logging.handlers
import socketserver
import struct

class MyUDPHandler(socketserver.BaseRequestHandler):

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print("{} wrote:".format(self.client_address[0]))
        print(self.unPickle(data)) # here is problem
        socket.sendto(data.upper(), self.client_address)

    def unPickle(self, data):
        return pickle.loads(data)

class LogRecordSocketReceiver(socketserver.UDPServer):
    allow_reuse_address = True

    def __init__(self, host='localhost',
                 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
                 handler=MyUDPHandler):
        socketserver.UDPServer.__init__(self, (host, port), handler)
        self.abort = 0
        self.timeout = 1
        self.logname = None

    def serve_until_stopped(self):
        import select
        abort = 0
        while not abort:
            rd, wr, ex = select.select([self.socket.fileno()],
                                       [], [],
                                       self.timeout)
        if rd:
            self.handle_request()
        abort = self.abort

if __name__ == "__main__":
   tcpserver = LogRecordSocketReceiver()
   print('About to start UDP server...')
   tcpserver.serve_until_stopped()

和udp_log_sender:

import logging, logging.handlers

rootLogger = logging.getLogger('')
rootLogger.setLevel(logging.DEBUG)

udp_handler = logging.handlers.DatagramHandler("localhost", logging.handlers.DEFAULT_TCP_LOGGING_PORT)      
rootLogger.addHandler(udp_handler)

logging.info('Jackdaws love my big sphinx of quartz.')

当服务器收到日志消息并想要 运行 unPickle 时,抛出 EOFError。什么会导致这种行为?

  1. 不剥离二进制数据
  2. 省略前 4 个字节(即使用数据 [4:]),因为它们包含转储对象的长度

我没有在日志记录模块文档中找到此信息 - 有时已经找到源代码(或者只是 google 更难)。