如何解决级别低于子级的父级记录器
一个包的常见做法是为顶级定义一个记录器,并让每个子模块通过 logging.getLogger(__name__)
获取一个子记录器。
问题:父记录器的级别低于子记录器。
我想专门从 package.module
禁用 DEBUG 日志,但要保持整体日志级别为 DEBUG。我尝试过这样的事情 -
logging.config.dictConfig({
"loggers": {
"package": {
"level": "DEBUG","handlers": ["console"],},"package.module": {
"level": "INFO"
}
}
})
然而,这并不像我期望的那样工作,只要子记录器传播其日志,父记录器就会输出调试日志。
我可以在这里做什么来仅阻止某些级别的孩子? 我可以将传播设置为 False 但这会完全阻止日志,这是不可取的。
解决方法
对我来说工作正常,“包”的“调试”消息被发出,而“package.module”的消息不是:
import logging,logging.config
logging.config.dictConfig({
'version': 1,'handlers': {
'console': {
'class': 'logging.StreamHandler',}
},"loggers": {
'root': {
'handlers': ['console'],},"package": {
"level": "DEBUG","package.module": {
"level": "INFO"
}
}
})
logging.getLogger('package').debug("should be emitted")
logging.getLogger('package.module').debug("should not be emitted")
记录器应该在接收时过滤消息,因此根据记录消息时的文档,如果它的级别低于记录器的有效级别,并且记录器的有效级别,它将被忽略有效级别是从记录器遍历到记录器树的根时找到的除 NOTSET
之外的第一个级别。如果遍历未找到任何内容,则有效级别为 NOTSET
,并且会发出所有消息(即使是低于 DEBUG
的消息)。
然而,这意味着如果 package.module
的后代配置回 DEBUG
,将覆盖 package.module
。这是一个重要的概念:记录器的级别是一个入口过滤器,一旦记录被接受,它们就不再是考虑因素了。
propagate
的用例相当不同,当您在树的中间级别配置“发出”处理程序时会使用它(否则记录将被多次发出)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。