2012-04-05 4 views
2

返される値がself.logger=getLogger(...)の属性に保持され、それに応じてロギングリクエスト(self.logger.info(...))を呼び出すラッパーロガークラスを作成しました。ハンドラ形式では、モジュール名と行番号を出力するために、タグ%(module)s%(lineno)dを使用します。残念ながら、私はロギングシステムへの最後の呼び出しが発生するので、行番号でラッパーモジュール名を取得するだけです。Pythonでモジュール名/スタックレベルが1つ上になっています

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

+0

ロガーはシングルトンなので、ラッパーインスタンスに保持することで何も得られません。私はラッパーを取り除くだろう - あなたを買うのは何ですか? –

答えて

2

私はラッパを使っていると少しばかげているのですが、ラムダを使って "extras"に似た、長い、厄介なパラメータを持つラップをラップすると、この問題が解決しました。他のところで良い答えを見つけられなかったので、私は分かち合うと思った。

(これは、Python 3.2.3ソリューションであり、再び、それはラムダラッパーではなく、クラスのラッパーに固有です。。)

ステップ1:..Lib \ログを見つけ、Pythonのソースコードを調べます\ __ init__.py、
手順b: "Logger.findCaller"メソッドを見つけ、どこかのユーティリティファイルにコピーし、 "find_caller_no_lambda"という名前に変更します。
次のステップ:味わうように変更、任意のモジュールレベル属性の接頭辞、メソッドシグネチャから「自己」を削除し、次のように変更します。

#  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.makeRecordを書き換えることができますそして、行番号、関数名などをログ呼び出し自体に追加する/あなたのラッパーでそのようなものを検出する。

関連する問題