Parent 级别低于 child 的记录器
Parent logger with level lower than child's
包为顶层定义一个记录器并让每个子模块通过 logging.getLogger(__name__)
使用一个 child 记录器是一种常见的做法。
问题:Parent 记录器的级别低于 child。
我想特别禁用来自 package.module
的 DEBUG 日志,但要保持整体日志级别为 DEBUG。我试过这样的事情 -
logging.config.dictConfig({
"loggers": {
"package": {
"level": "DEBUG",
"handlers": ["console"],
},
"package.module": {
"level": "INFO"
}
}
})
然而,这并没有像我预期的那样工作,只要 child 记录器传播它的日志,DEBUG 日志就会由 parent.
输出
我可以在这里做什么来阻止某些级别的 child?
我可以将传播设置为 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
的用例非常不同,当您在树的中间级别配置“发射”处理程序时使用它(否则记录将被发射多次)。
包为顶层定义一个记录器并让每个子模块通过 logging.getLogger(__name__)
使用一个 child 记录器是一种常见的做法。
问题:Parent 记录器的级别低于 child。
我想特别禁用来自 package.module
的 DEBUG 日志,但要保持整体日志级别为 DEBUG。我试过这样的事情 -
logging.config.dictConfig({
"loggers": {
"package": {
"level": "DEBUG",
"handlers": ["console"],
},
"package.module": {
"level": "INFO"
}
}
})
然而,这并没有像我预期的那样工作,只要 child 记录器传播它的日志,DEBUG 日志就会由 parent.
输出我可以在这里做什么来阻止某些级别的 child? 我可以将传播设置为 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
的用例非常不同,当您在树的中间级别配置“发射”处理程序时使用它(否则记录将被发射多次)。