在Python / Django中设置所有记录器的全局最小日志记录级别

时间:2014-07-24 16:12:55

标签: python django logging

在调用我的应用程序时,我希望能够(从配置或命令行或环境变量)读入所有记录器中的最小日志记录级别,然后全局设置日志记录模块以尊重这个MIN_LOGGING_LEVEL。

例如,类似这样的东西(不存在):logging.setLevel(logging.INFO)

据我所知,我可以单独在记录器和处理程序上设置日志记录级别,并为处理程序创建过滤器以尊重DEBUG标志之类的内容。但是,我真正想要的是能够在调用时更改所有记录器的最小日志级别(例如,取决于环境)。

我是否必须自己滚动并在运行时动态构造配置才能实现此目的?或者是否有更好的方法或模式,我没有看到?

4 个答案:

答案 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 保持不变。