2011-08-05 9 views
3

は、私は私のDjangoのサイトのために私自身のカスタムロガーを実装している動作しませんオーバーライド:私のWSGIファイルでWSGIのログインクラスは

class SpecialLogger(logging.Logger): 
    def __init__(self, name, level=logging.DEBUG): 
     logging.Logger.__init__(self, name, level) 

    def special(self, msg, *args, **kwargs): 
     self.log(self.level, msg, *args, **kwargs) 

、私が追加した行:

import logging 
from testbed.utils import SpecialLogger 
logging.setLoggerClass(SpecialLogger) 

で私のDjangoのビュー:

1 import logging 
2 logger = logging.getLogger('mylog') 
3 print str(logging.getLoggerClass()) 
4 print str(logger) 
5 print dir(logger) 

ライン#3プリントtestbed.utils.SpecialLogger

ライン#4プリント<logging.Logger instance at 0x21aadcac>

そして(もちろん)ライン#5はspecial

私の機能を示していない私が間違って何をしましたか? 3行目の間に矛盾があるのはなぜですか?& 4?

+0

3はクラスローガーを使用しているだけで印刷しています。 4はロガーオブジェクトを印刷しているだけです。 5の内容は何ですか?あなたの質問はなぜ異なっているのですか、なぜ特別な機能が利用できないのですか? – Iacks

+0

基本的に私は特別な機能が欠落している理由を知りたい。 – canadadry

答えて

0

setLoggerClass関数は、呼び出しが戻った後にインスタンス化されるすべてのロガーに対して使用されるクラスを設定しますが、呼び出し前に作成されたすべてのロガーは引き続きlogging.Loggerになります。 wsgiファイルに行を追加して、正しいクラスが使用されていることを確認することができます。

import logging 
from testbed.utils import SpecialLogger 
logging.setLoggerClass(SpecialLogger) 
logger = logging.getLogger('mylog') # should be a testbed.utils.SpecialLogger 

これは、所望の効果を生成しない場合、(例えばsettings.pyに)いくつかの他のコードは、上記のコードを実行する前に、ロガーをインスタンス化しなければなりません。

+0

私は 'myapp.wsgi'ファイルの' setLoggerClass'メソッドを数行上に移動することで問題を解決しました。それは今の魅力のように機能します。 – canadadry