在调用我的应用程序时,我希望能够(从配置或命令行或环境变量)读入所有记录器中的最小日志记录级别,然后全局设置日志记录模块以尊重这个MIN_LOGGING_LEVEL。
例如,类似这样的东西(不存在):logging.setLevel(logging.INFO)
据我所知,我可以单独在记录器和处理程序上设置日志记录级别,并为处理程序创建过滤器以尊重DEBUG标志之类的内容。但是,我真正想要的是能够在调用时更改所有记录器的最小日志级别(例如,取决于环境)。
我是否必须自己滚动并在运行时动态构造配置才能实现此目的?或者是否有更好的方法或模式,我没有看到?
答案 0 :(得分:6)
您可以使用logging.disable
- 以下内容确保禁用logging.INFO
及以下内容:
logging.disable(logging.INFO)
来自文档:
其效果是禁用所有严重性为lvl及以下的日志记录调用,因此如果使用值INFO调用它,则所有INFO和DEBUG事件都将被丢弃,而严重性为WARNING及以上的事件将根据记录器的有效水平。
要稍后撤消,您可以致电:
logging.disable(logging.NOTSET)
答案 1 :(得分:0)
我认为您正在寻找的是:
logging.getLogger().setLevel(logging.INFO)
答案 2 :(得分:0)
作为使用禁用功能的替代方法,您可以按如下方式覆盖 WARNING
的默认级别设置:
import logging
logging.getLogger().setLevel(logging.INFO) # choose your level here
我不会将其本身称为全局解决方案,因为它需要文件级声明,但在建立更具凝聚力的项目层次结构之前,它对于开发过程中的简单调试非常有用.
答案 3 :(得分:0)
我刚刚遇到了类似的问题,但我选择了不同的方向。我最终...
import logging
logging.root.setLevel(logging.DEBUG)
Python 记录器分层次工作,因此在根记录器上设置它会影响从它继承的所有下游记录器。
在其他一些示例中,代码 logging.getLogger()
也返回根记录器,因此此处的代码与这些示例基本相同。
了解记录器的层次结构后,这里的新信息是您无需在根目录上全局设置级别。您可以有选择性,同时仍然影响多个模块/记录器。
如果您使用代码 log = logging.getLogger(__name__)
在每个模块中检索您的记录器,并且如果您在包的 __init__.py
文件中配置您的记录器,您可以在该特定记录器上设置级别,从而影响该包内的所有记录器。
- package_a
- __init__.py
- module_a.py
- module_b.py
- package_b
- __init__.py
- module_c.py
- module_d.py
假设您设置了包和模块,如上所示。
import logging
logging.getLogger('package_a').setLevel(logging.DEBUG)
运行此代码将使 module_a.py 和 module_b.py 现在配置为 DEBUG 级别,而 module_c 和 module_d 保持不变。