首页 > 解决方案 > Python 3 动态更改日志级别似乎不起作用

问题描述

在我的应用程序中,我有一个主类,我在其中设置了此日志记录级别配置

logger = logging.getLogger('my-app')
logger.setLevel(logging.WARNING))

和其他配置登录文件。其他应用程序对象使用此本地记录器

self.logger = logging.getLogger('{}.{}'.format('my-app', self.__class__.__name__))

他们可以正确记录。在运行时,应用程序日志级别可以更改,因此我尝试在其他对象中使用此代码

level = logging.DEBUG
...
self.logger.setLevel(level)
- or -
logging.getLogger('my-app.'+self.__class__.__name__).setLevel(level)
- or -
logger = logging.getLogger()
logger.setLevel(level)

但没有一个有效。

所以我决定打印记录器对象的状态,我注意到日志级别发生了变化,但没有日志行打印在低于 WARN 的级别

pprint(vars(self.logger), indent=2)
#prints
# on app starts, log level WARN by default
{ 'disabled': False,
'filters': [],
'handlers': [],
'level': 0,
'manager': <logging.Manager object at 0x7f5355eb1160>,
'name': 'ClientDesktop.CApplicationStatus',
'parent': <logging.Logger object at 0x7f5359743668>,
'propagate': True}
# on log changed to DEBUG
{ 'disabled': False,
'filters': [],
'handlers': [],
'level': 10,
'manager': <logging.Manager object at 0x7f5355eb1160>,
'name': 'ClientDesktop.CApplicationStatus',
'parent': <logging.Logger object at 0x7f5359743668>,
'propagate': True}

如您所见,级别更改但没有登录文件。我还调试了日志库,我看到对 loggin 的检查已经过验证,因为我没有更改文件路径参数,所以我希望它应该继续工作。

谢谢您的帮助

编辑 正如 bruno desthuilliers 的回复中所解释的,我的处理程序有一个父母

logging.getLogger('my-app')

定义了所有处理程序的地方。将父级别和所有处理程序级别设置为新值就可以了。

谢谢。

标签: pythonpython-3.xlogging

解决方案


self.logger没有处理程序,所以它实际上只委托(“传播”)它的父母。如果所有父母级别都高于DEBUG,则该消息确实会被丢弃。

此外,处理程序也有一个级别,因此即使记录器的级别设置为DEBUG,处理程序仍将根据自己的级别过滤消息。这允许为同一记录器的不同级别使用不同的处理程序,但也可能导致消息被丢弃。

您没有提供足够的信息(这里是您的整个日志记录配置)来肯定地说明这是您的问题的原因,但鉴于问题的描述,它是最明显的罪魁祸首。


推荐阅读