[英]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.