2011-03-27 154 views
2

我发现了一个食谱做记录一个XML-RPC服务器的活动,在此我有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

回答

2

好的,我没有正确读取你的代码。现在我看到,在这个结构中,我无法做到我所提议的。我在这里要做的是在模块级准备自定义记录器并在LoggingSimpleXMLRPCRequestHandler中按名称检索它。

您正在做“主”中的一部分:配置名为“日志”的记录器。然后检索记录在LoggingSimpleXMLRPCRequestHandler

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

LoggingSimpleXMLRPCRequestHandler方法使用self.logger代替logger

+0

你能提供更多的细节吗? 这实际上是我的问题的要点?如何将记录器对象传递给我的ThreadingServer? – knguyen 2011-03-27 21:04:46

+0

对不起,以前我误解你的代码。请看我更新的答案。 – pajton 2011-03-27 21:42:45

+0

最后,谢谢。有用。 而不是在ctor中,我设置 logger = logging.getLogger('Log')in do_POST(self) – knguyen 2011-03-28 15:54:05