2017-05-06 17 views
2

私はpythonロガーをjupyterノートブックでテストしています。python logger - 一度しか実行できません

新しく起動したカーネルで次のコード例を実行すると、適切な内容のログファイルが作成され、作成されます。私はと言うと同じコードを再実行しようとした場合

import logging 
logging.basicConfig(filename='/home/depot/wintergreen/example.log',level=logging.DEBUG) 
logging.debug('This message should go to the log file') 
logging.info('So should this') 
logging.warning('And this, too') 

はしかし、例えば、ファイル名がexample.log2example.logから変更しても、何も起こりません、ファイルexample.log2は作成されません。

私はロギングを実行しようとすると、初めて実行したときにしか機能しないように見えたので、そのテストを終了しました。私はここで何が間違っていますか?

+0

作品... – thebjorn

+0

:一般的には、いつでもあなたはにbasicConfig()に問題がある、それは少し不便ですが、あなたはより多くの制御を与え、完全なAPIを使用する時間があることを意味し@thebjornあなたはジュピターノートでテストしましたか? –

+0

@thebjornそれは質問で二度言及している –

答えて

2

あなたは正しく、.basicConfig()kwargsを1回だけ使用します。初めての後にあなたがハンドラlogging.root.handlersを得たので、実際には1つのハンドラ、その提供の引数のごlen(root.handlers) != 0実際の割り当ては起きていないので、あなたはとてもsource code

def basicConfig(**kwargs): 
    ... 
    _acquireLock() 
    try: 
     if len(root.handlers) == 0: 
      ... 
    finally: 
     _releaseLock() 

で見れば。

再起動せずに変更する方法を

私が思いついた唯一の解決策は、カーネルを再起動せずに.basicConfig()を呼び出すことで、基本的なコンフィグレーションを変更するためにです:

からすべてのハンドラを削除します
for handler in logging.root.handlers: 
    logging.root.removeHandler(handler) 

ルートロガーとそれ以降は、あなたが好きなものを設定するのは良いです。

+0

okだから、 'logging.basicConfig'の変更をアカウントに反映させたいのであれば、解決策はカーネルを再起動することです。 –

+0

@jimbasquiat私はまだこれを調べていますが、 'logging.shutdown()'はこれを行うべきだが成功していないので、今は唯一の選択肢と思われます。私はそれを成功させると私はあなたを更新し続けます。:) –

+0

@jimbasquiat私は約束どおり私の答えを更新しました。 –

1

basicConfig()関数は1回だけ実行するように設計されているという問題があります。

ドキュメントごと:最初に実行すると、「デフォルトのFormatterでStreamHandlerを作成し、それをルートロガーに追加します」。しかし、2回目には、「機能はルートロガーにすでにハンドラが設定されている場合は何もしません」。

可能な解決策の1つは、logging.root.removeHandlerを使用して前のハンドラをクリアすることです。

>>> import logging 
>>> logging.basicConfig(filename='abc.txt') # 1st call to basicConfig 
>>> h = logging.root.handlers[0]   # get the handler 
>>> h.stream.close()      # close the current stream 
>>> h.stream = open('def.txt', 'a')   # set-up a new stream 

FWIW、にbasicConfig()loggingモジュールに遅れて加えたと一般的なケースのためのsimplified short-cut APIとして意図されていた。また、あなたはStreamHandlerのインスタンスで使用されるオープンストリームのストリーム属性に直接アクセスすることができます。私にとって

import logging 

# First pass 
h = logging.StreamHandler(open('abc.txt', 'a')) 
h.setLevel(logging.DEBUG) 
h.setFormatter(logging.Formatter('%(asctime)s | %(message)s')) 
logging.root.addHandler(h) 
logging.critical('The GPU is melting') 

# Later passes 
logging.root.removeHandler(h) 
h = logging.StreamHandler(open('def.txt', 'a')) 
h.setLevel(logging.DEBUG) 
h.setFormatter(logging.Formatter('%(asctime)s | %(message)s')) 
logging.root.addHandler(h) 
logging.critical('The CPU is getting hot too') 
関連する問題