3

self.logger=getLogger(...)の戻り値を属性に保持し、それに応じてロギング要求を呼び出すラッパー ロガー クラスを作成しました ( self.logger.info(...))。ハンドラー形式では、タグ%(module)sとを使用して、%(lineno)dモジュール名と行番号を出力します。残念ながら、ロギング システムへの最終的な呼び出しが行われる場所であるため、ラッパー モジュール名は行番号でしか取得できません。

代わりにラッパーを呼び出すモジュール名と行番号で関数を報告する方法を知っていますか?

4

2 に答える 2

2

説明したラッパーを使用するのは少しばかげていることに同意しますが、ラムダを使用して「extras」に類似した、長くて迷惑なパラメーターを持つ呼び出しをラップするときに、この問題を自分で解決しました。他の場所で良い答えが見つからなかったので、共有したいと思いました。

(これはPython 3.2.3ソリューションです。また、クラスラッパーではなくラムダラッパーに固有です。)

ステップ1:Pythonソースコードを検索し、.. Lib \ logging \ __ init __。pyを見つけます。
ステップb:「Logger.findCaller」メソッドを見つけ、それをユーティリティファイルのどこかにコピーし、名前を「find_caller_no_lambda」に変更します。
次のステップ:メソッドシグネチャから「self」を削除し、モジュールレベルの属性のプレフィックスを付け、次の変更を加えて、好みに合わせて変更します。

#       if filename == _srcfile: # Original line
        if filename == logging._srcfile or f.f_code.co_name == "<lambda>": # New line
            f = f.f_back # Original line for context.
            continue # Original line for context.

最後のステップ:ロガーが宣言されている場所に、次の行を挿入します。

my_logger.findCaller = util.find_caller_no_lambda

Voilà。

(もちろん、必要に応じて、その1つの小さな変更についてLoggerをサブクラス化することもできます。)

補遺:

逆に、Logger.makeRecordを書き直して、エクストラのキーの競合に対するチェックを削除し、行番号、関数名などをログ呼び出し自体に追加するか、ラッパーでそのようなものを検出することができます。

于 2012-11-27T18:59:54.917 に答える
0

Python Frame オブジェクトにあります。http://docs.python.org/library/inspect.html

于 2012-04-05T11:04:06.193 に答える