2016-07-15 9 views
1

私はPythonのログを使用していくつかの問題を抱えています。 main.pyとmymodule.pyという2つのファイルがあります。一般に、main.pyが実行され、mymodule.pyをインポートし、そこからいくつかの関数を使用します。しかし、時々mymodule.pyを直接実行します。pythonのログ - 子にメッセージが表示されない

ロギングが1つの場所にのみ設定されるようにしようとしましたが、何かが間違っているようです。

ここにコードがあります。

# main.py 
import logging 
import mymodule 

logger = logging.getLogger(__name__) 

def setup_logging(): 
    # only cofnigure logger if script is main module 
    # configuring logger in multiple places is bad 
    # only top-level module should configure logger 
    if not len(logger.handlers): 
     logger.setLevel(logging.DEBUG) 
     # create console handler with a higher log level 
     ch = logging.StreamHandler() 
     ch.setLevel(logging.DEBUG) 
     formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S') 
     ch.setFormatter(formatter) 
     logger.addHandler(ch) 

if __name__ == '__main__': 
    setup_logging() 
    logger.info('calling mymodule.myfunc()') 
    mymodule.myfunc() 

とインポートされたモジュール:

# mymodule.py 
import logging 

logger = logging.getLogger(__name__) 

def myfunc(): 
    msg = 'myfunc is being called' 
    logger.info(msg) 
    print('done with myfunc') 


if __name__ == '__main__': 
    # only cofnigure logger if script is main module 
    # configuring logger in multiple places is bad 
    # only top-level module should configure logger 
    if not len(logger.handlers): 
     logger.setLevel(logging.DEBUG) 
     # create console handler with a higher log level 
     ch = logging.StreamHandler() 
     ch.setLevel(logging.DEBUG) 
     formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S') 
     ch.setFormatter(formatter) 
     logger.addHandler(ch) 
    logger.info('myfunc was executed directly') 
    myfunc() 

私は、コードを実行すると、私はこの出力を参照してください。

$>python main.py 
INFO: 2016-07-14 18:13:04 <module>(22) -- calling mymodule.myfunc() 
done with myfunc 

をしかし、私はこれを参照することを期待:

$>python main.py 
INFO: 2016-07-14 18:13:04 <module>(22) -- calling mymodule.myfunc() 
INFO: 2016-07-14 18:15:09 myfunc(8) -- myfunc is being called 
done with myfunc 

誰でも持っている2番目のlogging.info呼び出しがスクリーンに印刷されない理由は何ですか?前もって感謝します!

答えて

0

ロガーは、ルートロガー(引数がない場合はlogging.getLogger()で取得)を最上位にして、階層内に存在します。各ロガーは親から設定を継承し、継承された設定を上書きするロガー自体の設定を継承します。この場合、ルートロガーを設定することはなく、モジュール固有のロガーのみをmain.pyに設定します。その結果、mymodule.pyのモジュール固有のロガーは設定されません。

logging.basicConfigmain.pyに設定すると、共有するオプションをすべてロガーに設定するのが最も簡単な方法です。

+0

ありがとうございますが、まだ動作していないようです。ロガーobjを作成する前に、ログレベルをINFOに設定しました。 so like logging.basicConfig(level = logging.INFO) logger = logging.getLogger(__ name__) 次に、setup_loggingの中で、レベルをデバッグしてchハンドラを追加します。その後、mymoduleの中で、logger.debugステートメントを追加しました。 main.pyを呼び出すと、mymoduleのデバッグメッセージは表示されません。 – box

0

Chepnerが正しいです。私はこの問題に夢中になった。問題は、ライン17を使用する場合は、インポートしたPythonモジュールを使うには

import logging 
logger = logging.getLogger() 
logger.debug("You will not see this message if you use line 17 in main") 

希望この投稿をsubmodule.pyすべてのメッセージをログに記録しませんあなたのメインスクリプト

16 log = logging.getLogger() # use this form to initialize the root logger 
17 #log = logging.getLogger(__name__) # never use this one 

に単純ですこの問題を抱えている人を助けることができます。

+0

この問題が発生したときに3.5でコーディングしていたので、問題はPython 3.5固有かどうかわかりません。 –

+0

これは私のためには機能しません。私がロガー名 'log = logging.getLogger(" main_log ")'をハードコードしていれば、それを動作させることができますが、メインモジュールだけが動作します。同じメソッドを使用するサブモジュールは、メッセージをログに表示しません。しかし、 'log = logging.getLogger()'を使うと、メインモジュールやそのサブモジュールからのメッセージは得られません。 – user5359531

関連する問題