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

时间:2016-01-13 08:28:09

标签: python-3.x logging udp

我在解决从logger中获取的数据时遇到了一些问题。鉴于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 个答案:

答案 0 :(得分:1)

  1. 不要删除二进制数据
  2. 省略前4个字节(即使用数据[4:]),因为它们包含转储对象的长度
  3. 我在日志记录模块文档中找不到这些信息 - 有时一个人去了源(或者只是谷歌更难)。