#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 аргумента.