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
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
Désolé, auparavant, j'ai mal lu votre code. S'il vous plaît voir ma réponse mise à jour. – pajton
Enfin, merci. Ça marche. Au lieu de le faire dans ctor, j'ai défini logger = logging.getLogger ('Log') dans do_POST (auto) – knguyen