如何处理Python XML-RPC输出和异常?

如何处理Python XML-RPC输出和异常?,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 似乎它并没有发送到标准输出,而是发送到其他地方 此外,当接收请求时发生异常时,整个应用程序会因以下错误而崩溃:

我创建了一个简单的实现,主要基于示例

但是,它发送的输出如下所示:

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)

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

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

server = SimpleXMLRPCServer(("localhost", 8000), logRequests = False)
这将抑制请求日志记录

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


正如您所看到的,第一部分是写入stdout的,这就是为什么
&2>1
不能完全工作的原因。如果要抑制它们,请重写或覆盖该方法。

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

python foobar 2>&1 >> foobar.log
首先将stderr重定向到stdout,然后再将stdout重定向到foobar.log。 stderr不会自动重定向到foobar.log。stderr仍然指向原始stdout

因此,我们应该这样做:

python foobar >> foobar.log 2>&1 

另请参见(搜索“多个重定向”)

我永远无法掌握输出重定向的窍门。也许我永远不会。。。我在crontab中经常使用它,所以也许我应该在将来首先检查它以供参考。我如何将日志请求重定向到其他地方?例如,
logging.getLogger()
的实例。另外,打印异常时应用程序是如何崩溃的?正如您在引用的代码(“SocketServer.py”来自标准库,由
xmlrpclib
间接使用)中所看到的,当异常发生时,应用程序不会崩溃,它只是被忽略。如果要重定向此类日志,可以编写自己的
BaseServer
/
BaseHTTPServer
/
SimpleXMLRPCServer
类(相互派生),或者简单地覆盖日志函数,例如
SocketServer.BaseServer.handle\u error=yourLogHandlerWhichWritesToLogger
python foobar >> foobar.log 2>&1