1

新しい Python スクリプトのログ モジュールをセットアップしました。私は 2 つのハンドラーを持っています。1 つはファイルへの送信用で、もう 1 つは電子メール アラート用です。SMTPHandler は、ERROR レベル以上のものをメールで送信するように設定されています。

SMTP 接続が失敗しない限り、すべてが正常に機能します。SMTP サーバーが応答しないか、認証が失敗した場合 (SMTP 認証が必要)、スクリプト全体が終了します。

私はPythonにかなり慣れていないので、メールでログメッセージを送信する際に問題が発生してもスクリプト全体がダウンしないように、SMTPHandlerが発生している例外をキャプチャする方法を見つけようとしています。ログ ファイルにもエラーを書き込んでいるので、SMTP アラートが失敗した場合でも、何も停止せずに続行したいと考えています。

「try:」ステートメントが必要な場合、logging.handlers.SMTPHandler セットアップを回避するか、my_logger.error() への個々の呼び出しを回避するか?

4

2 に答える 2

5

ロギング中に例外が発生しても、スクリプトが停止することはありませんが、トレースバックが に出力される可能性がありますsys.stderr。この印刷を防ぐには、次の手順を実行します。

logging.raiseExceptions = 0

これはデフォルトではありませんが (開発では通常、障害について知りたいため)、本番環境でraiseExceptionsは設定しないでください。

SMTPHandler次に ERROR (またはそれ以上) がログに記録されたときに、 が再接続を試みることがわかるはずです。

logging パススルーSystemExitと例外はありませKeyboardInterruptんが、ログを使用するアプリケーションの終了を引き起こさないように、他のすべてを処理する必要があります。これが当てはまらないことがわかった場合は、通過してスクリプトが終了する原因となっている例外の具体的な詳細と、Python/オペレーティング システムのバージョンについて投稿してください。ハンドラーをブロックする原因となるネットワーク タイムアウトがある場合 (たとえば、DNS ルックアップに長い時間がかかる場合、または SMTP 接続に長い時間がかかる場合)、スクリプトがハングしたように見える場合があることに注意してください。

于 2009-08-20T18:32:40.013 に答える
0

おそらく両方を行う必要があります。これを理解するには、ローカル メール サーバーをインストールして使用することをお勧めします。これにより、スクリプトの実行中にシャットダウンして、エラー メッセージを書き留めることができます。

コードを維持できるようにするには、すべてのロガー呼び出しを try-except でラップするのではなく、単一の場所で例外を処理できるように SMTPHandler を拡張する必要があります。

于 2009-08-20T07:55:43.407 に答える