Python 3动态更改日志级别似乎无法正常工作

时间:2018-06-16 09:09:30

标签: python python-3.x logging

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

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')

其中定义了所有处理程序。将父级别和所有处理程序级别设置为新值即可。

感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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