2010-02-13 6 views
4

나는 예제를 기반으로 간단한 Python XML-RPC 구현을 만들었습니다.파이썬 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) 

가 어떻게이 예외를 처리 할 수 ​​있습니다 예외가 요청이 오류로 전체 응용 프로그램이 충돌을 잡 발생

또한

? 정상적으로 복구해야하며 서버가 손상되는 대신 예외 메시지 만 기록하십시오.

답변

5

예제에서 SimpleXMLRPCServer 클래스를 사용하고있는 것 같습니다. 를 작성할 때 그 경우, 단순히 파라미터 logRequests을 제공 요청 로깅을 억제 할

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

한다. 당신이 볼 수 있듯이, 첫 번째 부분이되는, 표준 출력에 기록됩니다

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 

:

은 예외로, 그들은 BaseServer ("SocketServer.py"의 참조 소스 코드)에 로그인 한 왜 가 완전하게 작동하지 않았는가? 이를 억제하려면 해당 메소드를 대체하거나 겹쳐 쓰십시오.

+0

어떻게 다른 곳으로 로그 요청을 리디렉션까요? 예를 들어,'logging.getLogger()'의 인스턴스. 또한 예외가 인쇄 될 때 응용 프로그램이 어떻게 충돌합니까? –

+0

인용 된 코드 ('xmlrpclib'에 의해 간접적으로 사용되는 표준 라이브러리의 "SocketServer.py")에서 볼 수 있듯이, 예외가 발생했을 때 응용 프로그램이 충돌하지 않고 그냥 무시됩니다. 이러한 로그를 리디렉션하려면 자신 만의'BaseServer' /'BaseHTTPServer' /'SimpleXMLRPCServer' 클래스를 작성하거나 (서로 파생 된) 클래스를 작성하거나 간단히 로깅 기능을 덮어 쓸 수 있습니다. 'SocketServer.BaseServer.handle_error = yourLogHandlerWhichWritesToLogger'. – AndiDog

0

이것은 실제로 쉘 리디렉션 문제이며 파이썬 문제는 아닙니다. 당신이

python foobar 2>&1 >> foobar.log 

당신은 표준 출력으로 첫 리디렉션 표준 오류 및 foobar.log하기 위해 다음 리디렉션 표준 출력 말할 때. stderr이 자동으로 foobar.log로 리디렉션되지 않습니다. stderr은 여전히 ​​원래 stdout을 가리 킵니다.

그래서 대신 이렇게 :

python foobar >> foobar.log 2>&1 

도 참조

http://bash-hackers.org/wiki/doku.php/syntax/redirection ("다중 경로 재 지정"에 대한 검색)

+0

출력 리디렉션 ha가 중단되지 않습니다. 어쩌면 결코 ...나는 이것을 내 crontab에서 많이 사용하기 때문에 나중에 참조하기 위해 먼저 확인해야한다. –

관련 문제