2011-03-27 2 views
2

J'ai trouvé une recette se loguer les activités d'un serveur XML-RPC à http://code.activestate.com/recipes/496700-logging-simplexmlrpcserver/journalisation du serveur XML-RPC

Le problème que je vais avoir est que je veux réutiliser le LoggingSimpleRPCRequestHandler (c.-à importer) mais je n » Je sais comment définir correctement la variable 'logger'. L'idée est que

Cela fonctionne (LoggedWork.py):

from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler 
from SocketServer import ThreadingMixIn 

import os, sys 
import logging 

class RemoteObject:  
    def return10(self): 
     return 10 

class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): 
    """Overides the default SimpleXMLRPCRequestHander to support logging. Logs 
    client IP and the XML request and response. 
    """  

    def do_POST(self): 
     clientIP, port = self.client_address 
    # Log client IP and Port 

     logger.info('Client IP: %s - Port: %s' % (clientIP, port)) 
     try: 
      # get arguments 
      data = self.rfile.read(int(self.headers["content-length"])) 
      # Log client request 
     logger.info('Client request: \n%s\n' % data) 

      response = self.server._marshaled_dispatch(
        data, getattr(self, '_dispatch', None) 
       ) 
     # Log server response 
      logger.info('Server response: \n%s\n' % response) 

    except: # This should only happen if the module is buggy 
      # internal error, report as HTTP server error 
      self.send_response(500) 
      self.end_headers() 
     else: 
      # got a valid XML RPC response 
      self.send_response(200) 
      self.send_header("Content-type", "text/xml") 
      self.send_header("Content-length", str(len(response))) 
      self.end_headers() 
      self.wfile.write(response) 

      # shut down the connection 
      self.wfile.flush() 
      self.connection.shutdown(1) 

class ThreadingServer(ThreadingMixIn, SimpleXMLRPCServer): 
    pass 

if __name__ == "__main__": 

    logger = logging.getLogger('Log') 
    hdlr = logging.FileHandler('Log.log') 
    formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s") 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.INFO) 


    serveraddr = ('', 10001) 
    srvr  = ThreadingServer(serveraddr, LoggingSimpleXMLRPCRequestHandler)  
    srvr.register_instance(RemoteObject()) 
    srvr.register_introspection_functions() 

    srvr.serve_forever() 

et ce qui ne fonctionne pas (LoggedBroken.py):

from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler 
from SocketServer import ThreadingMixIn 
from LoggingSimpleXMLRPCRequestHandler import LoggingSimpleXMLRPCRequestHandler 
import os, sys 
import logging 

class RemoteObject:  
    def return10(self): 
     return 10 

class ThreadingServer(ThreadingMixIn, SimpleXMLRPCServer): 
    pass 

if __name__ == "__main__": 

    logger = logging.getLogger('Log') 
    hdlr = logging.FileHandler('Log.log') 
    formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s") 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.INFO) 


    serveraddr = ('', 10001) 
    srvr  = ThreadingServer(serveraddr, LoggingSimpleXMLRPCRequestHandler)  
    srvr.register_instance(RemoteObject()) 
    srvr.register_introspection_functions() 

    srvr.serve_forever() 

S'il y a une meilleure façon de le faire, s'il vous plaît donnez votre avis. Je vous remercie.

-k

Répondre

2

Ok, je n'ai pas lu correctement le code. Maintenant je vois que dans cette structure il est impossible de faire ce que j'ai proposé. Ce que je ferais ici est de préparer un enregistreur personnalisé au niveau du module et de le récupérer par son nom au LoggingSimpleXMLRPCRequestHandler.

Vous en faites partie dans "main": configuration de l'enregistreur avec le nom 'Log'. Ensuite, récupérer ce logger dans LoggingSimpleXMLRPCRequestHandler:

class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRequestHandler): 
    def __init__(self): 
     self.logger = logging.getLogger('Log') 

et à LoggingSimpleXMLRPCRequestHandler méthodes utilisent self.logger au lieu de logger.

+0

Pouvez-vous fournir plus de détails? C'est en fait l'essentiel de ma question? Comment est-ce que je passe l'objet de consignation à mon ThreadingServer? – knguyen

+0

Désolé, auparavant, j'ai mal lu votre code. S'il vous plaît voir ma réponse mise à jour. – pajton

+0

Enfin, merci. Ça marche. Au lieu de le faire dans ctor, j'ai défini logger = logging.getLogger ('Log') dans do_POST (auto) – knguyen