Python のログ (関数名、ファイル名、行番号) を 1 つのファイルで記録する 質問する

Python のログ (関数名、ファイル名、行番号) を 1 つのファイルで記録する 質問する

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

私が知っていることは以下の通りです:

  1. 関数名を取得するには、 を使用できますfunction_name.__name__が、function_name は使用したくありません (Log.info("Message")すべての関数の本体にジェネリックをすばやくコピーして貼り付けることができるようにするため)。マクロを使用して 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. ログ記録の使用方法と、それにハンドラーを追加してファイルにログを記録する方法はわかっていますが、プロジェクト内の関数呼び出しの正しい順序ですべてのログ メッセージを 1 つのファイルで記録できるかどうかはわかりません。

ベストアンサー1

これに対する正しい答えは、すでに提供されているfuncName変数

import logging
logger = logging.getLogger(__name__)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
logging.basicConfig(format=FORMAT)
logger.setLevel(logging.DEBUG)

次に、任意の場所に以下を追加します:

logger.debug('your message') 

現在作業中のスクリプトからの出力例:

[invRegex.py:150 -          handleRange() ] ['[A-Z]']
[invRegex.py:155 -     handleRepetition() ] [[<__main__.CharacterRangeEmitter object at 0x10ba03050>, '{', '1', '}']]
[invRegex.py:197 -          handleMacro() ] ['\\d']
[invRegex.py:155 -     handleRepetition() ] [[<__main__.CharacterRangeEmitter object at 0x10ba03950>, '{', '1', '}']]
[invRegex.py:210 -       handleSequence() ] [[<__main__.GroupEmitter object at 0x10b9fedd0>, <__main__.GroupEmitter object at 0x10ba03ad0>]]

おすすめ記事