3

私の Web アプリケーションは複数の Apache インスタンスで実行されており、これが原因でマルチプロセス ロギングの問題が発生しています。現在、SocketServer を使用してデーモンにログを記録するために SocketHandler を使用しています。デーモンは、ログを単一のログ ファイルに書き込みます (この例のように)。

ロギングに SocketHandler を使用しているため、ソケット サーバーがクラッシュしたかどうか、いつクラッシュしたかを特定するのに苦労しています。たとえば、リスニング ソケット サーバーを持たないポートの SocketHandler を作成しようとしても、例外は発生しません。このタイプのエラーをキャッチしてファイルに記録したいと思います。

私の質問は、SocketHandler を使用してログを記録するときに、使用されているソケットが現在リッスンされていないことをどのように発見できますか?

4

2 に答える 2

4

ソケット作成操作が失敗した場合 (たとえば、リッスンしているサーバーがないため)、デフォルトの動作は、次にイベントがログに記録されたときに、指数バックオフ アルゴリズムを使用して再試行することです。試すことができるいくつかのアプローチを次に示します。

  1. サブクラスSocketHandler化し、メソッドをオーバーライドcreateSocketし、実装でどのように例外を処理します。
  2. ソケットがまだ作成されていない場合、インスタンスのsock属性は になることに注意してください。イベントをログに記録した後の値である場合、SocketHandler がそれを送信していない可能性があります。SocketHandlerNoneNone
  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
    

もちろん、メッセージの送信中にサーバーがダウンした場合に発生するエラーを検出することはできませんが、少なくともサーバーの問題について警告する必要があります。

于 2010-02-08T08:40:17.610 に答える
1

現在の回復力のある実装では、それを行う方法はありません。この場合の「回復力」とは、SocketHandler問題が発生するとすぐに再オープンを試行することで、ソケットの問題を処理することを意味します。

サーバーを再起動するだけで、ハンドラーは最終的に再接続します。

于 2010-02-08T08:15:28.703 に答える