Python: ведение журнала и обработчик TCP

#python #python-2.7 #logging #tcp

#python #python-2.7 #ведение журнала #tcp

Вопрос:

Я написал свой обработчик 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)
  

Комментарии:

1. пожалуйста, предоставьте полную обратную трассировку. Кроме того, вы пропустили «self». перед logger.info (результат)

2. @MateuszL Я добавил полную обратную трассировку и «self».

Ответ №1:

MyHandler является подклассом SocketServer.StreamRequestHandler , который является подклассом BaseRequestHandler . Сигнатура вызова BaseRequestHandler.__init__ является

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

Сообщение об ошибке трассировки показывает, что внутри BaseServer.finish_request метода

 self.RequestHandlerClass(request, client_address, self)
  

вызывается. self.RequestHandlerClass есть MyHandler . Следовательно,
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 аргумента.