2011-01-18 8 views
12

私はPythonで3つのクラスを持ち、それらは異なるスレッドで実行されます。私はすべてのクラスから同じファイルに出力したいと思います。今はメインクラスで出力メソッドを作成し、コンストラクタを介して他のクラスに渡しています。それをよりうまく処理する方法はありますか?コンローラを使用する以外は、クラス間でロガーをどのように渡すことができますか?Pythonでのクラス間のロギング

おそらくpythonはJavaの静的メソッドのようなものをサポートしているので、3つのクラスすべてでLogger.info(メッセージ)のように書くことができますか?

もう一つの方法は、おそらく、すなわち

logger = open('debug.txt', 'w') 
sys.stdout = logger 

次に使用して呼び出しは、すべてのクラスではsys.stdout指定して、ファイルにグローバルsys.stdoutのをリダイレクトすることができます。

あなたはどう思いますか?

答えて

23
import logging 
log = logging.getLogger("mylog") 
log.setLevel(logging.DEBUG) 

formatter = logging.Formatter(
    "%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s") 
# Alternative formatting available on python 3.2+: 
# formatter = logging.Formatter(
#  "{asctime} {threadName:>11} {levelname} {message}", style='{') 

# Log to file 
filehandler = logging.FileHandler("debug.txt", "w") 
filehandler.setLevel(logging.DEBUG) 
filehandler.setFormatter(formatter) 
log.addHandler(filehandler) 

# Log to stdout too 
streamhandler = logging.StreamHandler() 
streamhandler.setLevel(logging.INFO) 
streamhandler.setFormatter(formatter) 
log.addHandler(streamhandler) 

# Test it 
log.debug("Some message") 
log.error("An error!") 
try: 
    something() 
except: 
    log.exception("An exception occured!") 

そしてDEBUG.TXTで取得:

 
2011-01-18 12:07:24,943 MainThread DEBUG  Some message 
2011-01-18 12:07:24,943 MainThread ERROR  An error! 
2011-01-18 12:07:24,943 MainThread ERROR  An exception occured! 
Traceback (most recent call last): 
    File "./logtest.py", line 17, in 
    something() 
NameError: name 'something' is not defined 

メッセージがログファイルに表示される順序は、あなたがログインしているとき、彼らは起こった順に正確に対応しない場合がありますいくつかのスレッドから。

+1

@ lazyr。答えてくれてありがとう。 3つのファイルすべてが同じログファイルに書き込まれるように、クラス間でログオブジェクトをどのように渡すことができますか? – yart

+1

私は上記のコードを別のファイル、例えばlog.pyとし、私は他の各モジュールの "log import logから"に行きます。 Pythonは一度モジュールをロードするだけです。最初のimport文はすでにロードされているものをフェッチするだけなので、すべてのスレッドで同じログオブジェクトになります。 –

+4

@lazyr: 'logging'モジュールの場合、それをする必要はありません。' logging'モジュール自体は、自身が作成したロガーを独自モジュール内に保持します。別のモジュールで 'logging.getLogger'をもう一度実行すれば、同じオブジェクトを取得できます。 – nosklo

関連する問題