Python 日志模块不遵守低于 '30' 的 setLevel(警告)?

标签 python logging python-3.3

我在这里有点不知所措。我可以发誓我上周早些时候就已经开始工作了。今天我又回到了它,但似乎无法开始工作。

在下面的示例脚本中,我希望能够对我的问题进行相对完整的演示。

测试.py

import logging
logger = logging.getLogger()
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.warning("Testing Warning")
logger.setLevel(60)
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.error("Testing Error")
logger.setLevel(50)
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.error("Testing Error")
logger.setLevel(40)
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.error("Testing Error")
logger.setLevel(30)
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.info("Testing Info")
logger.setLevel(20)
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.info("Testing Info")
logger.setLevel(10)
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.info("Testing Info")
logger.setLevel(0)
print("Logger currently at level '{0}'".format(logger.getEffectiveLevel()))
logger.info("Testing Info")

输出

Logger currently at level '30'
Testing Warning
Logger currently at level '60'
Logger currently at level '50'
Logger currently at level '40'
Testing Error
Logger currently at level '30'
Logger currently at level '20'
Logger currently at level '10'
Logger currently at level '0'

考虑到我正在使用this,我不知道为什么日志记录模块的行为不同。尝试并实现这一目标的官方文档。您可以在接近尾声时看到它如何公然忽略 logger 的级别。我是否以某种方式绕过了 logger 并根据默认值进行记录?我不明白。

谢谢!

最佳答案

您忘记向记录器添加处理程序。在 Python 3.3(及更高版本)上,如果未指定处理程序,则会出现内部 "handler of last resort"使用级别为 WARNING 的 。因此,即使您的消息是通过记录器发送的,它们也会被内部处理程序丢弃(内部处理程序只是为了捕获错误配置)。在 Python 2.x 上,您会收到一条一次性消息打印到 stderr - No handlers can be find for logger "root"

如果添加一行

logger.addHandler(logging.StreamHandler())

在第一次打印之前,您将得到如下行为:

Logger currently at level '30'
Testing Warning
Logger currently at level '60'
Logger currently at level '50'
Logger currently at level '40'
Testing Error
Logger currently at level '30'
Logger currently at level '20'
Testing Info
Logger currently at level '10'
Testing Info
Logger currently at level '0'
Testing Info

更新: 无需“手动添加处理程序” - 这只是说明问题所在的最简单方法。您可以使用 basicConfig() 简单地配置日志记录(控制台或文件,有限选项)或使用 dictConfig()配置更加灵活。这些方法在 Python 2.7 和 3.2(及更高版本)中以相同的方式工作。

关于Python 日志模块不遵守低于 '30' 的 setLevel(警告)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31191610/

相关文章:

python - 从字符串中删除出现在前一个字符串中的字母

python - 使用 virtualenv 安装 pip3

python - Silence PyLint 关于未使用的字符串插值变量的警告

python - While 循环在满足条件时不会终止

php - 需要帮助尝试使用 mysql 访问我的数据库

azure - Azure 聊天机器人中的 Logger 日志存储在哪里?

python - `python setup.py upload_docs` 成功但在线没有任何变化

python - 使用Python将给定的相对路径添加到字符串中的另一个路径

r - R中Boxplot中的对数Y轴

python - Python 中的 Unicode 和(希腊语)变音符号