3

Python ロガーの命名で説明されている方法に従って、Python ロガーに名前を付けました。

basicConfig() を使用すると、すべて正常に動作します。しかし、今は構成ファイルと dictConfig() を使用して、実行時にロガーを構成しようとしています。

http://docs.python.org/2/library/logging.config.html#dictionary-schema-detailsのドキュメントには、ルートロガーを構成する辞書に「ルート」キーを含めることができると書かれているようです。しかし、このロガーのみを構成すると、出力が得られません。

ここに私が持っているものがあります:

logging_config.yaml

version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(pathname)s:%(lineno)s - %(message)s'
    datefmt: '%Y%m%d %H:%M:%S'

handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
  file:
    class: logging.FileHandler
    level: DEBUG
    formatter: simple
    filename: 'test.log'
    mode: "w"

# If I explicitly define a logger for __main__, it works
#loggers: 
#  __main__:
#    level: DEBUG
#    handlers: [console, file]
root:
  level: DEBUG
  handlers: [console, file]

test_log.py

import logging
logger = logging.getLogger(__name__)
import logging.config
import yaml

if __name__ == "__main__":
    log_config = yaml.load(open("logging_config.yaml", "r"))
    logging.config.dictConfig(log_config)
    #logging.basicConfig() #This works, but dictConfig doesn't
    logger.critical("OH HAI")
    logging.shutdown()

これでログ出力が生成されないのはなぜですか? また、それを修正する適切な方法は何ですか?

4

1 に答える 1

2

その理由はdisable_existing_loggers: false、YAML で指定されておらず、ロガーが呼び出さ__main__れた時点で既に存在しているためです。dictConfigそのため、ロガーは無効になっています(構成で明示的に名前が付けられていないため、名前付けられていても無効になっていません)。

その行を YAML に追加するだけです。

version: 1
disable_existing_loggers: false
formatters:
  simple:
  ...
于 2013-09-25T09:55:42.040 に答える