繁体   English   中英

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

[英]universal logger name in python logging yaml config file

好的,所以情况是我需要使用yaml配置文件进行日志记录。(不要问-我只需要它:))。 当编写'loggers:'指令时,我想使用一个logger,并能够使用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

所以就在这里-它起作用。 “完成!” 消息显示在控制台中。 但是我希望能够在配置中设置的不是某个独特的记录器(在这里我称之为“ app”),而是一个通用的,例如,如果它位于.py配置中,它将是

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

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

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

我在Python文档中找到了这个:

root-这将是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级别。

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

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

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

现在可以了。 即使我创建了logging.getLogger('something')记录器,并且记录器'something'不在配置中,该应用也将使用''记录器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM