Pythonの標準logging
を使用して私のモジュールの適切なロギングを達成できません。それは非常に単純なケースです。 私は、次のモジュールの階層を持っている:子ロガーのログが2回表示される
module\
foo.py
bar.py
私は、次の制約にこれらのモジュールのそれぞれからログインする必要があります。
- すべてのログ> =
INFO
module.foo
からコンソールに(何このモジュールので、い重要であり、ユーザーが605からファイルに)ライブ - すべてのログ> =
WARNING
をから - すべてのログを通知しなければなりませんコンソール
からは、ここでの主なコード
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
いいですが、まだありません。 'module.foo.level = DEBUG'を設定しなければ、' log.debug( 'module.foo ..') 'が表示されませんでした。それでも、 'log.info( 'モジュール。bar ') 'はまだログから抜けています。何か案は ? – Overdrivr
質問を編集してより明瞭にしました – Overdrivr
質問の変更に基づいて回答が更新されました。希望が役立ちます。 – wmorrell