2016-10-19 4 views
0

ich meine TCP-Handler schrieb wie folgt (in Anlehnung an: https://docs.python.org/2/library/socketserver.html#socketserver-tcpserver-example):Python: Protokollierung und TCP-Handler

#!/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() 

Es funktioniert perfekt und jetzt versuche ich einen Logger hinzuzufügen:

#!/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() 

Wenn ich es laufen bekomme ich folgende Fehlermeldung:

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

Ich verstehe nicht, was die 4 Argumente sind. Gibt es irgendetwas anderes an dem Code?

EDIT: Voll Traceback:

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) 
+0

bitte vollständige Rückverfolgung bereitstellen. Außerdem hast du "Selbst" vermisst. vor logger.info (Ergebnis) – MateuszL

+0

@MateuszL Ich habe die vollständige Backtrace und "Selbst." – EliseB

Antwort

2

MyHandler ist eine Unterklasse von SocketServer.StreamRequestHandler, die eine Unterklasse von BaseRequestHandler ist. Die call signature of BaseRequestHandler.__init__ ist

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

Die Meldung Traceback-Fehler zeigt, dass im Inneren des BaseServer.finish_request method

self.RequestHandlerClass(request, client_address, self) 

genannt wird. self.RequestHandlerClass ist MyHandler. Daher MyHandler.__init__ sollte Anruf Signatur

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

statt

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

haben Wenn self.RequestHandlerClass(request, client_address, self) genannt wird, Python ruft die RequestHandlerClass Methode mit self als erstes Argument. Mit anderen Worten, RequestHandlerClass(self, request, client_address, self) wird aufgerufen. self, request, client_address, self sind die vier Argumente, die an MyHandler übergeben werden. Die Fehlermeldung

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

reklamierte und MyHandler.__init__ nur 1 Argument erwarten definiert wurde und doch wurde es 4 Argumente übergeben werden.

+0

Guter Punkt, Selbst, Selbst .... – dsgdfg

Verwandte Themen