2017-09-21 16 views
2

Pythonの標準loggingを使用して私のモジュールの適切なロギングを達成できません。それは非常に単純なケースです。 私は、次のモジュールの階層を持っている:子ロガーのログが2回表示される

module\ 
    foo.py 
    bar.py 

私は、次の制約にこれらのモジュールのそれぞれからログインする必要があります。

  1. すべてのログ> = INFOmodule.fooからコンソールに(何このモジュールので、い重要であり、ユーザーが​​605からファイルに)ライブ
  2. すべてのログ> = WARNINGを​​から
  3. すべてのログを通知しなければなりませんコンソール

からは、ここでの主なコード

import logging 
import logging.config 
import os 
import yaml 

def setup_logging(): 
    loadfrom = os.path.join(os.path.dirname(__file__), 'config.yml') 
    # Load 
    with open(loadfrom, 'rt') as f: 
     config = yaml.safe_load(f.read()) 
    logging.config.dictConfig(config) 

setup_logging() 

foo = logging.getLogger('module.foo') 
bar = logging.getLogger('module.bar') 

foo.info('module.foo doing something') 
foo.debug('module.foo debug data') 

bar.info('module.bar doing something') 
bar.error('module.bar something bad happened') 

は、ここで私は

version: 1 
disable_existing_loggers: False 
formatters: 
    simple: 
     format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" 

handlers: 
    console: 
     class: logging.StreamHandler 
     level: INFO 
     formatter: simple 
     stream: ext://sys.stdout 
    file: 
     class: logging.handlers.RotatingFileHandler 
     level: DEBUG 
     filename: 'log.log' 
     formatter: simple 
     encoding: utf8 

loggers: 
    module: 
    level: WARNING 
    handlers: [console] 
    propagate: yes 
    module.foo: 
    level: INFO 
    handlers: [console] 
    propagate: yes # If yes, gets displayed twice. If false, entry is missing in log file 
root: 
    level: DEBUG 
    handlers: [file] 

を使用している設定であり、ここで出力されます。

2017-09-21 10:48:39,679 - module.foo - INFO - module.foo doing something 
2017-09-21 10:48:39,679 - module.foo - INFO - module.foo doing something 
2017-09-21 10:48:39,681 - module.bar - ERROR - module.bar something bad happened 

子モジュールのlog.infoが表示されます。 configではpropagateフィールドがyesに設定されているためです。 falseに設定すると、コンソールの問題は解決されますが、ログファイルにエントリがないため、ログファイルが壊れます。

どうすればこの問題を解決できますか?私が個人的に直観に反している標準ライブラリの代替案はありますか?

EDIT 1

新しいコンフィグ@ wmorellの回答後:、

2017-09-21 11:14:51,174 - module.foo - INFO - module.foo doing something 
2017-09-21 11:14:51,174 - module.bar - ERROR - module.bar something bad happened 

ログ出力がOKでないlog.info('module.bar')にコールをミス:

handlers: 
    console: 
     class: logging.StreamHandler 
     level: INFO 
     formatter: simple 
     stream: ext://sys.stdout 
    file: 
     class: logging.handlers.RotatingFileHandler 
     level: DEBUG 
     filename: 'log.log' 
     formatter: simple 
     encoding: utf8 

loggers: 
    module: 
    level: WARNING 
    handlers: [console] 
    propagate: yes 
    module.foo: 
    level: DEBUG <- set this to debug 
    handlers: [file, console] <- Add file here 
    propagate: false 
root: 
    level: DEBUG 
    handlers: [file] 

コンソール出力はOKです

2017-09-21 11:18:34,335 - module.foo - INFO - module.foo doing something 
2017-09-21 11:18:34,335 - module.foo - DEBUG - module.foo debug data 
2017-09-21 11:18:34,335 - module.bar - ERROR - module.bar something bad happened 

答えて

1

はロガーの定義に明示的にfileハンドラを追加し、別のログレベルをフィルタリングするconsoleハンドラを複製:

handlers: 
    console_info: 
    class: logging.StreamHandler 
    level: INFO 
    formatter: simple 
    stream: ext://sys.stdout 
    console_warning: 
    class: logging.StreamHandler 
    level: WARNING 
    formatter: simple 
    stream: ext://sys.stdout 
    file: 
    class: logging.handlers.RotatingFileHandler 
    level: DEBUG 
    filename: 'log.log' 
    formatter: simple 
    encoding: utf8 
loggers: 
    module: 
    level: DEBUG 
    handlers: [file, console_warning] 
    propagate: false 
    module.foo: 
    level: DEBUG 
    handlers: [file, console_info] 
    propagate: false 

ログは最初のロガーの定義で濾過ますので、modulemodule.fooロガーはDEBUG許可する必要がありますそれらがログファイルに作成されている場合。ロガーはすべてのハンドラにメッセージを転送し、ハンドラはメッセージを設定されたしきい値よりも下に置くことができます。そのため、基本ロガーにはINFOのログを廃棄するハンドラと、より具体的なmodule.fooロガーにはINFOのログを許可するハンドラが必要です。

+0

いいですが、まだありません。 'module.foo.level = DEBUG'を設定しなければ、' log.debug( 'module.foo ..') 'が表示されませんでした。それでも、 'log.info( 'モジュール。bar ') 'はまだログから抜けています。何か案は ? – Overdrivr

+0

質問を編集してより明瞭にしました – Overdrivr

+0

質問の変更に基づいて回答が更新されました。希望が役立ちます。 – wmorrell

関連する問題