记录 setLevel 被忽略

新手上路,请多包涵

以下代码是从文档中复制的。我应该能够看到所有的信息日志。但我没有。即使我已将 setLevel 设置为 INFO,我也只能看到警告及以上警告。

为什么会这样? foo.py

 import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

输出:

 workingDirectory$ python foo.py
warn message
error message
critical message

信息和调试消息去哪儿了??

原文由 meh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 724
2 个回答

正如一些用户所指出的,使用:

 logging.basicConfig(level=logging.DEBUG, format='%(message)s')

就像在接受的答案中写的那样不是一个好的选择,因为它 设置了根记录器的日志级别,因此它可能会导致意外行为(例如,如果您设置第三方库可能会开始记录调试消息 loglevel=logging.DEBUG )

在我看来,最好的解决方案是为您的记录器设置日志级别,如下所示:

 import logging

logger = logging.getLogger('MyLogger')
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

不是真正直观的解决方案,但如果您只想为“MyLogger”设置日志级别并保持根记录器不变,则这是必需的。

那么,为什么 logging.basicConfig(level=logging.DEBUG, format='%(message)s') 全局设置日志级别?

好吧,实际上它没有。如前所述,它只是更改根记录器的配置,并且如 python 文档 中所述:

记录器永远不应直接实例化,而应始终通过模块级函数 logging.getLogger(name) 进行实例化。多次调用同名的 getLogger() 将始终返回对同一 Logger 对象的引用。

因此, logging.basicConfig 正在创建一个带有默认 Formatter 的 StreamHandler 并将其添加到根记录器。

关键是,如果任何其他库正在使用“根记录器”,您也将为该库设置该日志级别,这样您就可能开始看到来自第三方库的调试日志。

这就是为什么我认为最好创建您自己的记录器并设置您自己的格式化程序和处理程序,这样您就可以保持根记录器不变。

原文由 Manuel Fedele 发布,翻译遵循 CC BY-SA 4.0 许可协议

更换线路

logger.setLevel(logging.DEBUG)

logging.basicConfig(level=logging.DEBUG, format='%(message)s')

它应该按预期工作。如果您不使用任何处理程序配置日志记录(如在您的帖子中 - 您只为记录器配置一个级别,但在任何地方都没有处理程序),您将获得一个内部处理程序 “最后的手段” ,它设置为仅输出 WARNING 级别的消息(没有其他格式)。

原文由 Vinay Sajip 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题