【问题标题】:How do I handle Python XML-RPC output and exceptions?如何处理 Python XML-RPC 输出和异常?
【发布时间】:2011-01-16 13:00:29
【问题描述】:

我创建了一个简单的Python XML-RPC 实现,主要基于示例。

但是,它会发送如下输出:

foo.bar.com - - [13/Feb/2010 17:55:47] "POST /RPC2 HTTP/1.0" 200 -

... 到终端,即使我使用>>> 将标准输出和标准错误重定向到文件。我正在使用以下行来执行此操作:

python foobar 2>&1 >> foobar.log

似乎它不是发送到标准输出,而是发送到其他地方。

此外,当接收请求时发生异常时,整个应用程序会因以下错误而崩溃:

----------------------------------------
Exception happened during processing of request from ('1.2.3.4', 51284)

我该如何处理这个异常?我需要优雅地恢复,只记录异常消息而不是服务器崩溃。

【问题讨论】:

    标签: python xml-rpc


    【解决方案1】:

    这确实是一个 shell 重定向问题,而不是 python 问题。 当你说

    python foobar 2>&1 >> foobar.log
    

    首先将stderr重定向到stdout,然后second将stdout重定向到foobar.log。 stderr 不会自动重定向到 foobar.log。 stderr 仍然指向原来的标准输出。

    所以改为这样做:

    python foobar >> foobar.log 2>&1 
    

    另见http://bash-hackers.org/wiki/doku.php/syntax/redirection(搜索“多重重定向”)

    【讨论】:

    • 我永远无法掌握输出重定向的窍门哈。也许我永远不会......我在我的 crontab 中经常使用它,所以也许我应该在将来首先检查它以供参考。
    【解决方案2】:

    我猜你正在使用示例中的SimpleXMLRPCServer 类。在这种情况下,只需在创建时提供参数logRequests

    server = SimpleXMLRPCServer(("localhost", 8000), logRequests = False)
    

    这将抑制请求记录。

    关于异常,登录BaseServer(参见“SocketServer.py”的源代码):

    def handle_error(self, request, client_address):
        """Handle an error gracefully.  May be overridden.
    
        The default is to print a traceback and continue.
    
        """
        print '-'*40
        print 'Exception happened during processing of request from',
        print client_address
        import traceback
        traceback.print_exc() # XXX But this goes to stderr!
        print '-'*40
    

    如您所见,第一部分被写入标准输出,这就是&2>1 不能完全工作的原因。如果您想抑制它们,请覆盖或覆盖该方法。

    【讨论】:

    • 如何将日志请求重定向到其他地方?例如,logging.getLogger() 的实例。另外,打印异常时应用程序如何崩溃?
    • 正如您在引用的代码(标准库中的“SocketServer.py”,xmlrpclib 间接使用)中看到的那样,应用程序在发生异常时不会崩溃,它只是得到忽略。如果您想重定向此类日志,您可以编写自己的 BaseServer/BaseHTTPServer/SimpleXMLRPCServer 类(相互派生),或者简单地覆盖日志功能,例如SocketServer.BaseServer.handle_error = yourLogHandlerWhichWritesToLogger.
    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2011-12-15
    • 2016-02-26
    相关资源
    最近更新 更多