【问题标题】:Python 3 changing log level dynamically seems not workingPython 3 动态更改日志级别似乎不起作用
【发布时间】:2018-06-16 09:09:29
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: python python-3.x logging


    【解决方案1】:

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

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

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

    【讨论】:

    • 你是对的:我的self.logger 有一个父级(在示例中是logging.getLogger('my-app'))并且没有处理程序。所有处理程序都在父级中定义。设置父级别和所有父级的处理程序级别就可以了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多