ホームページ  >  記事  >  バックエンド開発  >  単一ファイルを使用した Python ログ (関数名、ファイル名、行番号)

単一ファイルを使用した Python ログ (関数名、ファイル名、行番号)

PHPz
PHPz転載
2024-02-08 22:00:211103ブラウズ

使用单个文件的 Python 日志记录(函数名、文件名、行号)

#質問の内容

アプリケーションがどのように動作するかを理解しようとしています。これを行うには、ログ出力にメッセージを送信する関数の名前と (コード内の) 行番号を記録することを目的として、各関数の本体の最初の行としてデバッグ コマンドを挿入します。最後に、このアプリケーションは多くのファイルで構成されているため、アプリケーションの制御フローをよりよく理解できるようにログ ファイルを作成したいと思います。

これが私が知っていることです:

  1. 関数名を取得するには、

    function_name.__name__ を使用できますが、function_name は使用したくありません (汎用の Log.info(" をすぐにコピーして貼り付けることができます)メッセージ") をテキスト内のすべての関数に適用します)。 C では __func__ マクロを使用してこれを実行できることはわかっていますが、Python についてはよくわかりません。

  2. ファイル名と行番号を取得するために、私のアプリケーションが Python

    locals() 関数を使用していることを確認しました (そして私はそう信じています)。しかし、完全に理解していない構文を使用しています。例: options = " LOG.debug('%(flag)s : %(flag_get)s' % locals()) LOG.info("My message %s" を使用してみました) % locals()) を使用して、{'self': <__main__.Class_name object at 0x22f8cd0>} のようなものを生成します。これについて何か入力はありますか?

  3. ログの使用方法とそれにハンドラーを追加してファイルにログを記録する方法は知っていますが、単一のファイルを使用してすべてのログ メッセージを関数呼び出しの正しい順序でログに記録できるかどうかわかりません。プロジェクト。

#正解

ここには無関係な質問がいくつかあります。

最も単純な (3) から始めます。

logging

を使用すると、すべての呼び出しを 1 つのログ ファイルまたはその他の出力先に集約できます。呼び出しは、プロセス内で発生した順序で並べられます。 次のステップ: (2)。

locals()

現在のスコープの辞書を提供します。したがって、他のパラメーターのないメソッドでは、スコープ内に self があり、これには現在のインスタンスへの参照が含まれます。あなたを混乱させるトリックは、% 演算子として辞書を使用する rhs の文字列フォーマットです。 "%(foo)s" % bar は、bar["foo"] の値に置き換えられます。 最後に、

pdb

で使用されるものと同様のいくつかのイントロスペクション手法を使用して、より多くの情報を記録できます。 リーリー これにより、受信メッセージに加えて、(元の) 関数名、関数が定義されているファイルの名前、およびそのファイル内の行が記録されます。詳細については、「

inspect - ライブ オブジェクトの検査

」を参照してください。 前のコメントで述べたように、いつでも

import pdb; 行を挿入して、

pdb 対話型デバッグ プロンプトを入力することもできます。 pdb.set_trace()<code> を実行し、プログラムを再実行します。これにより、コードをステップ実行し、選択に従ってデータを検査できるようになります。

以上が単一ファイルを使用した Python ログ (関数名、ファイル名、行番号)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。