【问题标题】:XML-RPC server loggingXML-RPC 服务器日志记录
【发布时间】:2011-03-27 20:42:21
【问题描述】:

我在http://code.activestate.com/recipes/496700-logging-simplexmlrpcserver/找到了一个记录 XML-RPC 服务器活动的方法

我遇到的问题是我想重用 LoggingSimpleRPCRequestHandler(即导入它),但我不知道如何正确设置“记录器”变量。这个想法是

这有效(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

【问题讨论】:

    标签: python logging xml-rpc


    【解决方案1】:

    好的,我没有正确阅读您的代码。现在我看到,在这种结构中,不可能按照我的建议去做。我在这里要做的是在模块级别准备自定义记录器并在LoggingSimpleXMLRPCRequestHandler 中按名称检索它。

    您正在“main”中做部分工作:配置名称为“Log”的记录器。然后在LoggingSimpleXMLRPCRequestHandler 中检索该记录器:

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

    LoggingSimpleXMLRPCRequestHandler 方法中使用self.logger 而不是logger

    【讨论】:

    • 你能提供更多细节吗?这实际上是我问题的要点?如何将记录器对象传递给我的 ThreadingServer?
    • 抱歉,之前我误读了您的代码。请查看我的更新答案。
    • 最后,谢谢。有用。我没有在 ctor 中执行此操作,而是在 do_POST(self) 中设置 logger = logging.getLogger('Log')
    猜你喜欢
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多