[解決済み] Pythonのログ(関数名、ファイル名、行番号)を1つのファイルを使って記録する。
質問
私は、アプリケーションがどのように動作するかを学ぼうとしています。そして、このために、私は関数の名前とログ出力にメッセージを送る行番号(コード内)を記録することを目的として、各関数の本体の最初の行としてデバッグコマンドを挿入しています。最後に、このアプリケーションは多くのファイルで構成されているので、アプリケーションの制御フローをよりよく理解するために、1つのログファイルを作成したいと思います。
以下は私が知っていることです。
-
関数名を得るために、私は
function_name.__name__
を使うこともできますが、function_name は使いたくありません (そうすれば、一般的なLog.info("Message")
をすべての関数本体にコピー&ペーストできるようにするため)。私は、これはCで以下を使用して行うことができることを知っています__func__
マクロを使用してCで行うことができることを知っていますが、私はパイソンについてはよくわかりません。 -
ファイル名と行番号を取得するために、私は私のアプリケーションが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). 使用方法
logging
を使うと、すべての呼び出しをひとつのログファイルや他の出力先に集約することができます:それらはプロセス内で発生した順番になります。
次は (2).
locals()
は現在のスコープの dict を提供します。したがって、他に引数のないメソッドでは
self
をスコープに入れ、そこに現在のインスタンスへの参照が含まれています。使用されているトリックで困っているのは、dict を使用して文字列のフォーマットを
%
演算子の右辺に dict を使っていることです。
"%(foo)s" % bar
の値は何にでも置き換えられます。
bar["foo"]
の値で置き換えられます。
最後に、いくつかのイントロスペクションのトリックを使うことができます。
pdb
で使用されるような、より多くの情報を記録することができるいくつかのイントロスペクションのトリックを使用することができます。
def autolog(message):
"Automatically log the current function details."
import inspect, logging
# Get the previous frame in the stack, otherwise it would
# be this function!!!
func = inspect.currentframe().f_back.f_code
# Dump the message + the name of this function to the log.
logging.debug("%s: %s in %s:%i" % (
message,
func.co_name,
func.co_filename,
func.co_firstlineno
))
これは渡されたメッセージと(オリジナルの)関数名、その定義が現れるファイル名、そのファイル内の行を記録します。次の例を見てください。 inspect - 生きたオブジェクトを検査する をご覧ください。
先ほどのコメントにもあったように、ドロップインで
pdb
という行を挿入することで、いつでも対話式デバッグプロンプトに入ることができます。
import pdb; pdb.set_trace()
を挿入し、プログラムを再実行する。これにより、コードを段階的に実行し、選択したデータを検査することができます。
関連
-
pythonを使ったオフィス自動化コード例
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] オブジェクト名の前のシングルアンダーコアとダブルアンダーコアの意味は何ですか?
-
[解決済み] Pythonで大きなファイルの行数を安価に取得する方法は?
-
[解決済み】Pythonのエラーをデバッグ情報とともにログに記録する方法は?
-
[解決済み】複数のモジュールでロギングを使用する
-
[解決済み] Pythonでソースファイル名と行数を記録する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない