ホームページ  >  記事  >  バックエンド開発  >  ロギング モジュールを使用して Python で未処理の例外をログに記録するにはどうすればよいですか?

ロギング モジュールを使用して Python で未処理の例外をログに記録するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-23 00:10:03753ブラウズ

How Can I Log Unhandled Exceptions in Python Using the Logging Module?

Python でのキャッチされなかった例外のログ

明示的に処理されない限り、Python 例外はデフォルトでプログラムの標準エラー ストリーム (stderr) に出力されます。ただし、代わりにロギング モジュールを使用して、キャッチされない例外をログに記録することが望ましい場合もあります。

キャッチされない例外をログに記録する従来のアプローチは、例外ブロック内でlogging.Exception(e) メソッドを手動で使用することです。以下に示すように、

<code class="python">try:
    raise Exception, 'Throwing a boring exception'
except Exception, e:
    logging.exception(e)</code>

ただし、キャッチされなかった例外ごとにlogging.Exception(...) を自動的に呼び出すことで、手動の手順が不要になります。

実装

次のコード スニペット:

<code class="python">import sys
import logging

# Custom logger with handler for stdout
logger = logging.getLogger(__name__)
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)

# Custom exception handler to log uncaught exceptions
def handle_exception(exc_type, exc_value, exc_traceback):
    # Ignore KeyboardInterrupt for Ctrl + C exit
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return

    logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))

# Assign custom exception handler
sys.excepthook = handle_exception

if __name__ == "__main__":
    raise RuntimeError("Test unhandled")</code>

この変更されたスクリプトは、いくつかの重要なタスクを実行します:

  • カスタム ログ: ログ モジュールを利用して、捕捉されなかった例外をフォーマットして記録します。
  • 標準出力処理: カスタム ハンドラーを使用して例外を標準出力に送り、例外がコンソール ウィンドウに表示されるようにします。
  • 選択的例外処理: Ctrl C による正常なコンソール終了を維持するために KeyboardInterrupt 例外を無視します。

デフォルトの例外ハンドラーを handle_Exception でオーバーライドすることにより、設定されたロガーを使用してキャッチされなかった例外が自動的にログに記録され、可視性が向上し、デバッグが容易になります。

以上がロギング モジュールを使用して Python で未処理の例外をログに記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。