2011-08-16 19 views
3

モジュールにロギングを含めたいが、モジュールに新しいログオブジェクト/ファイルを作成させたくない場合は、呼び出し元のログオブジェクトを使用したい彼らが1つを渡す場合。私はすべてのログをtryブロックに入れることができますが、それは厄介です。私が最終的に思いついたのはうまくいくようだが、それはかなりクルージングしているようだし、もっと良い方法があると確信している。Pythonの条件付きログ

class MyClass(object): 
    def __init__(self, arg1, arg2, log=None): 
     if log == None: 
      class log(object): 
       def error(self, msg): pass 
       def warning(self, msg): pass 
       def info(self, msg): pass 
       def debug(self, msg): pass 
      self.log = log() 
     else: 
      self.log = log 
     self.log.debug('Starting') 

このような処理を行うにはどうすればよいでしょうか?

ありがとうございます!

+0

私はそれがかなりいいと思う。あなたのログクラスをシングルトンに入れ、それを使って各クラスのコードを減らすには、それをNoneLogと呼んでください。 – Arne

答えて

0

直接loggingモジュール、すなわち:

logging.debug('Starting') 

、彼らがしたい場合はルートロガーを変更するには、呼び出し元にそれを任せることで提供される機能を使用してください。

+0

私は従いません。彼らがログオブジェクトを渡さなかった場合、どのように動作しますか? – zenzic

+0

ロギングモジュールは標準ライブラリの一部であり、インポートされた各モジュールにカスタムログオブジェクトを渡す必要はありません。 – geoffspear

1

ほとんどのロガーは、(ダミー関数を呼び出す代わりに)実際にログに記録されるロガーがあるクラス(ある場合)を管理するために、いくつかの集中リソースにファクトリパターンを使用します。つまり、集中APIと集中管理があり、クラスごとにロガーを定義する必要はありません。

渡されたパラメータをあるものから別のものへの信号として表示することは、一般的には「このオブジェクトを使用してにジョブを実行する必要があります。」と表示することをお勧めします。 MyClassがロガーでない限り、それをパラメーターとして渡すのは実際には意味がありません。ロガーがその仕事をする必要はないはずです。

0

好ましいパターン:

import logging 
LOGGER = logging.getLogger(__name__) 

class MyClass(object): 
    logger = LOGGER 

    def do_something(self, somesuch): 
     self.logger.debug("Starting %s", somesuch) 

myInstance = MyClass() 
if need_fancy_logging: 
    myInstance.logger = logging.getLogger("FancyLogger") 

myInstance.do_something("blabla") 

EDIT:本当に標準loggingモジュールは、実際には何も含まない、すべての権利を行います。絶対ない出力が警告を除き、発生しない

Python 2.7 (r27:82500, Sep 16 2010, 18:03:06) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import logging 
>>> log = logging.getLogger('foo') 
>>> log.debug('debug') 
>>> log.info('info') 
>>> log.error('error') 
No handlers could be found for logger "foo" 
>>> log.error('error') 
>>> 

注消費されたことメッセージを示すために一度が印刷されていること、この特定のロガーのせいです。

+0

私は何かを逃しているか、自分自身を明確にしていないと思います。私が書いている授業は他の人によって使われるだろうし、私は彼らが何をするかを支配していない。ログを設定している場合はログを記録したいが、ログファイルを設定していなければstdoutにダンプしたくない(私が思う)。あなたの方法はそれを促進するでしょうか? – zenzic