私はアプリケーションがどのように動作するかを学ぼうとしています。そのために、各関数の本体の最初の行にデバッグ コマンドを挿入し、関数名と、ログ出力にメッセージを送信する行番号 (コード内) をログに記録することを目標としています。最後に、このアプリケーションは多数のファイルで構成されているため、アプリケーションの制御フローをよりよく理解できるように、単一のログ ファイルを作成したいと考えています。
私が知っていることは以下の通りです:
関数名を取得するには、 を使用できます
function_name.__name__
が、function_name は使用したくありません (Log.info("Message")
すべての関数の本体にジェネリックをすばやくコピーして貼り付けることができるようにするため)。マクロを使用して C でこれを行うことができることは知っています__func__
が、Python についてはよくわかりません。ファイル名と行番号を取得するために、アプリケーションが Python 関数を使用していることを確認しました (そう信じています) 。
locals()
ただし、その構文は完全には理解していません。たとえば、options = "LOG.debug('%(flag)s : %(flag_get)s' % locals())
のような関数を使用してみましたが、LOG.info("My message %s" % locals())
のようなものが生成されます{'self': <__main__.Class_name object at 0x22f8cd0>}
。これについて何かアドバイスはありますか?ログ記録の使用方法と、それにハンドラーを追加してファイルにログを記録する方法はわかっていますが、プロジェクト内の関数呼び出しの正しい順序ですべてのログ メッセージを 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>]]