python日志记录yaml配置文件中的通用记录器名称

时间:2017-11-03 15:29:13

标签: python python-2.7 logging configuration yaml

好的,所以情况是我需要使用yaml配置文件进行日志记录。(不要问 - 我只需要它:))。在编写'记录器时:'指令我想使用一个记录器,并能够使用getLogger(__name__)从我的应用程序中的多个模块中获取它。如果我使用普通的python配置文件进行日志记录,我知道该怎么做,但是我无法找到一种方法来对yaml文件做同样的事情。 使用python 2.7 长话短说,这就是我所拥有的(这只是我的问题的简化示例,而不是实际应用的一部分:)):

#this is app.py
import logging.config
import yaml
import os

def init_logging():
    path = 'logging.yaml'
    if os.path.exists(path):
        with open(path, 'r') as f:
            config = yaml.safe_load(f.read())
        logging.config.dictConfig(config['logging'])
    main()


def main():
    logger = logging.getLogger('app')
    logger.debug("done!")


init_logging()

这里是logging.yaml配置文件:

logging:
    version: 1
    formatters:
        brief:
            format: '%(message)s'
        default:
            format: '%(asctime)s %(levelname)-8s [%(name)s] %(message)s'
            datefmt: '%Y-%m-%d %H:%M:%S'

    handlers:
        console:
            class: logging.StreamHandler
            level: DEBUG

    loggers:
        app:
            handlers: [console]
            level: DEBUG

就像它在这里一样 - 它有效。完成了!'消息显示在控制台中。 但是我希望能够在配置中设置一些不同的记录器(这里我称之为“应用程序”),但是它是通用的,就像它在.py配置中一样,它将是

"loggers": {
    "": {
        "handlers": ["console"],
        "level": "DEBUG",
    },
}

然后我将在不同的模块中使用logging.getLogger(__name__),它总是使用一个""记录器并显示消息。 那么有没有办法在yaml中创建通用记录器?喜欢python日志配置中的"":? 我试过(),〜,null - 那些不做的工作。 基本上我需要能够使用我想要的任何名称调用记录器并获得一个指定的记录器。 是的 - 我可以在yaml中创建一个root指令,并使用logging.getLogger()

来调用它

2 个答案:

答案 0 :(得分:1)

诀窍是在其他记录器列表之外使用名为root的特殊记录器。

我在Python documentation

中找到了这个
  

root - 这将是根记录器的配置。除了propagate设置不适用之外,配置的处理与任何记录器一样。

以下问题的配置已更改为使用root密钥:

logging:
    version: 1
    formatters:
        brief:
            format: '%(message)s'
        default:
            format: '%(asctime)s %(levelname)-8s [%(name)s] %(message)s'
            datefmt: '%Y-%m-%d %H:%M:%S'

    handlers:
        console:
            class: logging.StreamHandler
            level: DEBUG

    root:
        handlers: [console]
        level: WARN
    loggers:
        app:
            level: DEBUG

这会在app级别配置DEBUG,在WARN级别配置其他所有内容。

答案 1 :(得分:1)

好的,所以我找到了答案(感谢@flyx!)。 我比较了原始的python dict配置和从yaml dict配置转换,发现日志记录会自动将disable_existing_loggers: False添加到python配置中。之后我将这一行添加到yaml并在loggers指令中使用''并且它有效! 因此得到的yaml配置就像:

..............
disable_existing_loggers: False

loggers:
    '':
        handlers: [console, sentry]
        level: DEBUG
        propagate: False

现在它有效。即使我创建了一个像logging.getLogger('something')这样的记录器而且记录器'某些'不在配置中,那么该应用程序将使用''记录器。

@Don Kirkby的答案如果在文件的开头定义记录器(在配置它之前)将不起作用。但是,如果在配置日志记录后定义了记录器,则它没有问题。所以这是我的问题代码的决心,但不是问题的答案 - “那么有没有办法在yaml中创建一个通用记录器?比如”:在python logging config中?“这就是为什么我没有选择它作为答案。但他的评论完全合法:)