我创建了一个简单的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)
如何处理此异常?我需要优雅地恢复,只记录异常消息而不是服务器崩溃。
答案 0 :(得分: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
正如您所看到的,第一部分是写入stdout的,这就是&2>1
无法完全运行的原因。如果要禁止它们,请覆盖或覆盖该方法。
答案 1 :(得分:0)
这实际上是一个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(搜索“多重重定向”)