Ведение журнала на сервере XML-RPC - PullRequest
2 голосов
/ 28 марта 2011

Я нашел рецепт ведения журнала действий сервера XML-RPC на http://code.activestate.com/recipes/496700-logging-simplexmlrpcserver/

Проблема, с которой я столкнулся, заключается в том, что я хочу повторно использовать LoggingSimpleRPCRequestHandler (т.е. импортировать его), но незнать, как правильно установить переменную 'logger'.Идея заключается в том, что

Это работает (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()

, а это не (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()

Если естьлучший способ сделать, пожалуйста, посоветуйте.Спасибо.

-k

1 Ответ

2 голосов
/ 28 марта 2011

Хорошо, я не правильно прочитал ваш код. Теперь я вижу, что в этой структуре невозможно сделать то, что я предложил. Я хотел бы подготовить собственный регистратор на уровне модуля и получить его по имени в LoggingSimpleXMLRPCRequestHandler.

Вы делаете часть этого в "main": настраиваете регистратор с именем 'Log'. Затем найдите этот регистратор в LoggingSimpleXMLRPCRequestHandler:

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

и в LoggingSimpleXMLRPCRequestHandler методы используют self.logger вместо logger.

...