【问题标题】:Understanding Python logger names了解 Python 记录器名称
【发布时间】:2013-09-30 14:11:36
【问题描述】:

我按照Naming Python loggers 中描述的做法命名了我的 Python 记录器

如果我使用 basicConfig(),一切正常。但现在我正在尝试使用配置文件和 dictConfig() 在运行时配置记录器。

http://docs.python.org/2/library/logging.config.html#dictionary-schema-details 的文档似乎说我的字典中有一个“root”键来配置根记录器。但是如果我只配置这个记录器,我不会得到任何输出。

这是我所拥有的:

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()

为什么这不会产生任何日志输出,修复它的正确方法是什么?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    原因是您没有在 YAML 中指定 disable_existing_loggers: false,并且在调用 dictConfig__main__ 记录器已经存在。所以该记录器被禁用(因为它没有在配置中明确命名 - 如果它命名,那么它不会被禁用)。

    只需将该行添加到您的 YAML:

    version: 1
    disable_existing_loggers: false
    formatters:
      simple:
      ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      相关资源
      最近更新 更多