Как мне обработать вывод Python XML-RPC и исключения? - PullRequest
4 голосов
/ 13 февраля 2010

Я создал простую реализацию 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 ]

5 голосов
/ 13 февраля 2010

Полагаю, вы используете класс 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 не работает полностью. Если вы хотите подавить их, переопределите или перезапишите этот метод.

0 голосов
/ 13 февраля 2010

Это действительно проблема перенаправления оболочки, а не проблема Python. Когда вы говорите

python foobar 2>&1 >> foobar.log

Вы сначала перенаправляете stderr на стандартный вывод, а затем второй перенаправляете стандартный вывод на foobar.log. stderr не перенаправляется автоматически на foobar.log. stderr по-прежнему указывает на исходный стандартный вывод.

Так что вместо этого сделайте это:

python foobar >> foobar.log 2>&1 

См. Также http://bash -hackers.org / wiki / doku.php / синтаксис / перенаправление (поиск «Несколько перенаправлений»)

...