Python ログにスタックトレースを出力する

Python Rogunisutakkutoresuwo Chu Lisuru



特定の瞬間のアプローチ コールのコレクションは、スタック トレースで表されます。プログラムが例外を発生させると、Python はトレースバックまたはバックトレースとも呼ばれるスタックトレースを生成します。このスタックトレースには、問題の特定に利用できるさまざまな詳細があります。 Python ロギング パッケージには、いくつかの基本的な機能が付属しており、「debug」、「info」、「warning」、「error」、「critical」などの複数レベルのロギングがあります。

例 1: Traceback モジュールを利用して Python で Stacktrace を出力する

この例では、単純なコードを使用して、Python の traceback モジュールを実装してスタック トレースを出力する方法を示します。このトラックバック パッケージには、コンピューター言語からスタック トレースを収集、保存、および表示するための好評な機能が含まれています。スクリプトのスタック トレース出力操作を忠実に複製します。スタック トレースを表示する必要がある場合は、必須です。

つまり、スタック トレースは、問題の原因となった操作の前に行われた各操作を表示します。最も重要な情報は、スタック トレースの最後の行で常に報告されます。これは、障害が特定されたときです。結果のエラーのすべての関数呼び出しを使用して、問題をすばやく特定して解決できます。







トレースバック Python ライブラリをインポートしてコードを実装することから始めましょう。次に、次の行で配列を作成し、いくつかの値を持つ要素をリストします。配列リストの値は「7」、「8」、「9」、「10」です。配列リストには 4 つの値があります。この配列リストは、以前に初期化された変数「A」に保存されました。



それに続いて、次の行で「try」という用語と値「A = 6」を使用します。 Python の try-except ブロックを使用して、例外を管理します。このアプローチは、ブロック ヘッダーでエラーを発生させるスクリプトを作成するために使用されます。例外は、構文エラーと同様に本質的にエラーです。プログラムの例外中、例外処理は、例外に応答する固有の行為です。スクリプトに戻ると、次の行で「except」を使用します。



例外ブロックでは、「printing exception」の略である「traceback.print exc()」を使用します。 「プログラム終了」である例外ボックス内で「print()」関数を使用して、例外が発生したときにこのステートメントが出力されるようにします。これで、try ボックスで例外が発生した場合、プログラムはすぐに except ブロックに移動して続行します。例外が発生しない場合、例外ブロックは完全にスキップされます。例外が発生したため、配列リストにないにもかかわらず、値「6」が試行ボックスに入力されたことをコードで確認できます。その結果、コードはすぐに例外ボックスに移動し、出力ディスプレイに「プログラム終了」ステートメントを出力します。





トレースバックを構成するさまざまな関数呼び出しは、最新のものから最も古いものへ、下から上へと並べられます。これらの操作はすべて 2 行のステートメントで表されます。各呼び出しはファイル名、シーケンス番号、およびモジュール名で始まり、これらはすべてコードの場所を示しています。その後、宣言されたリストに値「6」が含まれていなかったため、例外の print ステートメント「program end」が表示され、「リスト インデックスが範囲外」という結果が出力されます。



例 2: Logging.Exception() メソッドを利用して Python でスタックトレースを出力する

この例では、Python の「logging.exception()」メソッドを使用してスタック トレースを出力する方法を示します。 Python のログ パッケージを使用すると、エラーをログに記録できるだけでなく、エラーと例外を記録することもできます。ロギング モジュールでは、「debug」、「info」、「warning」、「error」、「critical」などのロギング モジュールを選択できます。簡単に言えば、これらは基本的にロギング モジュールのレイヤーです。 Python でエラーのある例外をログに記録するには、「logging.exception()」関数を使用します。この関数は、ERROR ステータスのレポートをこのロガーに追加します。パラメータはデバッグ用であると考えられています。例外に関する情報は、ログ レポートに添付されます。このプロシージャを呼び出す唯一の場所は、例外ハンドラである必要があります。

それでは、コードを見てみましょう。まず、2 つのライブラリをインポートします。最初のライブラリはログ記録で、2 番目のライブラリはトレースバックです。次に、「basicConfig」メソッドを「logging」で使用し、レベルを「logging.Debug」として指定します。 「getLogger()」メソッドが取る唯一の引数は「name」です。したがって、「logging.getlogger」関数を使用するときに使用します。名前が指定されている場合、その名前のロガー インスタンスへの参照が生成されます。それ以外の場合は、ルートが返されます。同じロガー オブジェクトが、同じ ID を持つ多くの getLogger() 操作によって参照されています。

次に、try を使用します。try ブロックでわかるように、例外を発生させる可能性のあるコードを記述します。この場合、「myfunction()」を使用します。与えられた状況が一致しない場合、例外が発生します。次に、コードはすぐに except ブロックにジャンプします。この例外のブログでは、「logging.info」を使用しています。その中に、「例外が発生しました」という出力したいメッセージを書き込みます。これは、例外が発生した場合、単純にエラーが発生し、このメッセージが画面に表示されるためです。ただし、エラーが発生しない場合は、例外メッセージ全体が無視されます。

また、メッセージで「exc info=True」を設定します。 「logger.exception()」で起こることと同様に、exc 情報が True に設定されている場合、スタックトレース全体がログに含まれます。唯一の違いは、ロガーを交換するだけで、ログ レベルをエラーから別のものにすばやく切り替えることができることです。

スクリプトで例外が発生したため、出力の最初の行は「例外が発生しました」というメッセージであり、その後にスクリプトで使用されたログ レベルである「情報」が続きます。この場合、ロガーの名前はルートとして表示されます。次に、トレースバック呼び出しが表示され、モジュール、行、およびファイル名が表示されます。最後に、エラー メッセージ「myfunction」が定義されていません。

ロギングを利用するコードについてもう少し話しましょう。 exception() メソッドは、ロギング用のライブラリーをインポートすることから始めます。次に、2 つの変数「m」と「n」が初期化され、それぞれ「7」と「0」の値が与えられます。次のステップで try ブロックが使用されるようになりました。その中に、例外を引き起こす可能性のあるコードを記述します。まず、変数「o」を宣言します。次に、その「m」を「n」で割った値を設定します。分母が 0 であり、任意の数を 0 で割ることができないため、これにより例外が発生します。つまり、エラーが発生します。その結果、コードは「logging.error」が使用されている except ブロックにジャンプします。エラーはログのレベルです。例外が発生した場合は、「例外が発生しました」というメッセージまたはステートメントを出力し、「exc info=true」を設定します。 true に設定しない場合、例外ブロックのみが出力され、トレースバック情報は表示されません。

スクリプトで「エラー」レベルを選択したため、最初にロガーの名前としてルートが表示され、その後に「例外が発生しました」というメッセージが表示されます。ファイル名、行番号、およびモジュールを含むトレースバック情報が表示されます。分母をゼロにすることはできないため、次の行にエラー通知が表示されます。このコードでは分母がゼロであるため、このエラーはゼロ除数エラーと呼ばれます。

結論

この記事では、スタック トレースを Python ログに出力するプロセスと、traceback モジュールを使用してスタック トレースを作成する方法について説明しました。最初の例では、traceback ライブラリがインポートされ、try メソッドと except メソッドが使用されました。コードはトライボックスに書きました。例外が発生すると、例外ブロックにすばやく移動し、例外ステートメントを画面に表示します。 2 番目の例では、最初の例と同様のロギングを利用しました。 exception() メソッドは、「info」および「error」レベルのロギングを使用します。例外が発生すると、例外ステートメントが表示されます。