2010-02-08 2 views
2

내 웹 응용 프로그램이 멀티 파일 아파치 인스턴스에서 실행되며 이로 인해 다중 프로세스 로깅 문제가 발생합니다. 나는 현재 단일 로그 파일 (similar to this example)에 로그를 쓰는 SocketServer를 사용하여 데몬에 로깅하기 위해 SocketHandler를 사용하고 있습니다.Python에서 SocketHandler로 로깅 할 때 오류 잡기

로깅을 위해 SocketHandler를 사용 했으므로 소켓 서버가 손상된 경우를 발견하는 데 문제가 있습니다. 예를 들어 리스닝 소켓 서버가없는 포트에 대해 SocketHandler를 만들려고해도 아무런 예외가 발생하지 않습니다. 이 오류 유형을 잡아 파일에 기록하고 싶습니다.

내 질문은 SocketHandler를 사용하여 로깅 할 때 사용중인 소켓이 현재 수신 대기 중이 지 않은 것을 어떻게 확인할 수 있습니까?

답변

3

소켓 수신 작업이 실패한 경우 (예 : 수신 대기 서버가 없기 때문에) 기본 동작은 다음에 이벤트가 기록 될 때 지수 백 오프 알고리즘으로 다시 시도하는 것입니다. 여기에 당신이 시도 할 수있는 몇 가지 방법은 다음과 같습니다

  1. 서브 클래스 SocketHandler에서, createSocket 방법을 무시하고 어떻게 당신이 당신의 구현 것이다 예외를 처리합니다.
  2. 소켓이 아직 생성되지 않은 경우 SocketHandler 인스턴스의 sock 특성은 None이됩니다. 이벤트를 기록한 후에 값이 None이면 SocketHandler가 이벤트를 보내지 않았을 가능성이 큽니다.
  3. 처리기의 makeSocket 메서드는 실제로 소켓을 만들고 연결하는 데 사용됩니다. 따라서 아무 것도 기록하기 전에 makeSocket 번으로 전화를 걸 수 있습니다. 예외가 발생하면 서버가 수신 대기하지 않는 것입니다. 성공을 반환하면 반환 된 값을 닫을 수 있습니다.
  4. 하위 클래스 SocketHandleremit 메서드를 재정의하고 하위 클래스에는 사용할 대체 핸들러 인스턴스 (예 : FileHandler 또는 SMTPHandler)에 대한 참조가 있습니다. 당신의 emit 코드에서 서버가 메시지를 전송하는 중간에 다운되면 물론

    if self.sock is None: 
        self.createSocket() 
    if self.sock is None: 
        # creation failed: do self.alternate_handler.handle(record) 
    else: 
        # creation succeeded: defer to superclass implementation 
    

, 이것은 발생하는 오류를 잡을 수를 사용하여 소켓을 만들려고하지만해야 적어도 서버에 대한 몇 가지 문제점을 경고합니다.

+0

방법 번호 4는 지금까지 저를 위해 작동하고있는 것처럼 보입니다. :) 나는 소켓이 완전히 실패한 것 같으면서 모든 오류를 잡는 것에 대해 걱정하지 않는다. –

1

현재 탄력적 인 구현을 통해이를 수행 할 방법이 없습니다. "Resilient"는이 경우에 SocketHandler이 문제가 발생하자마자 소켓을 다시 열려고 시도하여 소켓 문제를 처리한다는 것을 의미합니다.

서버를 다시 시작하면 처리기가 결국 다시 연결됩니다.

+0

로그가없는 경우 서버를 다시 시작할시기를 어떻게 알 수 있습니까? –

+0

서버 프로세스를 모니터하십시오. –