【问题标题】:Python: logging and TCP handlerPython:日志记录和 TCP 处理程序
【发布时间】:2016-10-19 13:40:22
【问题描述】:

我的 TCP 处理程序编写如下(改编自:https://docs.python.org/2/library/socketserver.html#socketserver-tcpserver-example):

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import SocketServer

from MyModule import myFunction

class MyHandler(SocketServer.StreamRequestHandler):

    def handle(self):
        self.data = self.rfile.readline().strip()
        result = myFunction(self.data)
        self.wfile.write(result)

if __name__ == "__main__":
    HOST, PORT = myhost, myport
    server = SocketServer.TCPServer((HOST, PORT), MyHandler)
    server.serve_forever()

它工作得很好,现在我正在尝试添加一个记录器:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import SocketServer
import logging
from logging.handlers import TimedRotatingFileHandler

from MyModule import myFunction

class MyHandler(SocketServer.StreamRequestHandler):

    def __init__(self):
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)
        self.formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
        self.file_handler = TimedRotatingFileHandler('my_log_file.log', when='D', interval=1, utc=True)
        self.file_handler.setLevel(logging.DEBUG)
        self.file_handler.setFormatter(self.formatter)
        self.logger.addHandler(self.file_handler)

    def handle(self):
        self.data = self.rfile.readline().strip()
        result = myFunction(self.data)
        self.wfile.write(result)

        self.logger.info(result)

if __name__ == "__main__":
    HOST, PORT = myhost, myport
    server = SocketServer.TCPServer((HOST, PORT), MyHandler)
    server.serve_forever()

当我运行它时,我收到以下错误:

TypeError: __init__() takes exactly 1 argument (4 given)

我不明白给出的 4 个参数是什么。 除此之外代码还有什么问题吗?

编辑:完整追溯:

Exception happened during processing of request from ('MyIP', 54028)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
    self.RequestHandlerClass(request, client_address, self)
TypeError: __init__() takes exactly 1 argument (4 given)

【问题讨论】:

  • 请提供完整的回溯。另外,你错过了“自我”。在 logger.info(result) 之前
  • @MateuszL 我添加了完整的回溯和“自我”。

标签: python python-2.7 logging tcp


【解决方案1】:

MyHandlerSocketServer.StreamRequestHandler 的子类,BaseRequestHandler 的子类。 call signature of BaseRequestHandler.__init__

def __init__(self, request, client_address, server):

回溯错误信息显示BaseServer.finish_request method里面

self.RequestHandlerClass(request, client_address, self)

被调用。 self.RequestHandlerClassMyHandler。所以, MyHandler.__init__ 应该有调用签名

class MyHandler(SocketServer.StreamRequestHandler):
    def __init__(self, request, client_address, server):

而不是

class MyHandler(SocketServer.StreamRequestHandler):
    def __init__(self):

self.RequestHandlerClass(request, client_address, self) 被调用时,Python 调用 RequestHandlerClass 方法以 self 作为其第一个参数。换句话说, RequestHandlerClass(self, request, client_address, self) 被调用。 self, request, client_address, self 是传递给 MyHandler 的四个参数。 错误信息

TypeError: __init__() takes exactly 1 argument (4 given)

抱怨 MyHandler.__init__ 被定义为只需要 1 个参数,但它被传递了 4 个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多