如何处理Python XML-RPC输出和异常?
我创建了一个简单的 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)
我该如何处理这个异常呢?我需要优雅地恢复,而不是让服务器崩溃,只记录下异常信息。
2 个回答
0
这其实是一个关于命令行重定向的问题,而不是Python的问题。
当你这样写的时候:
python foobar 2>&1 >> foobar.log
你首先把错误信息(stderr)重定向到了标准输出(stdout),然后第二把标准输出重定向到了foobar.log文件。这样一来,错误信息并不会自动重定向到foobar.log文件里,它仍然指向原来的标准输出。
所以你应该这样做:
python foobar >> foobar.log 2>&1
你可以查看这个链接了解更多信息:http://bash-hackers.org/wiki/doku.php/syntax/redirection(搜索“多个重定向”)
5
我猜你是在使用示例中的 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
并没有完全生效。如果你想要停止这些记录,可以重写或者覆盖那个方法。