在Python/Django中设置所有记录器的全局最低日志级别
在我启动应用程序的时候,我希望能够从配置文件、命令行或者环境变量中读取一个最小的日志级别,然后全局设置日志模块,让所有的日志记录器都遵循这个最小日志级别。
举个例子,类似于这样(虽然实际上并不存在): logging.setLevel(logging.INFO)
我明白我可以单独为每个日志记录器和处理器设置日志级别,也可以为处理器创建过滤器,以便处理像DEBUG这样的标志。但是,我真正想要的是在启动时能够改变所有日志记录器的最小日志级别(比如根据环境的不同)。
我是不是需要自己动手,动态构建配置来实现这个功能?还是说有更好的方法或者模式我没有想到?
4 个回答
我觉得你想要的就是这个:
logging.getLogger().setLevel(logging.INFO)
除了使用禁用功能之外,你还可以通过下面的方式来改变默认的警告级别设置为WARNING
:
import logging
logging.getLogger().setLevel(logging.INFO) # choose your level here
我不太会把这个称为一个全局解决方案,因为它需要在文件中声明,但我觉得在开发初期进行简单调试时,这个方法还是挺有用的,尤其是在项目结构还没完全理顺的时候。
我刚遇到类似的情况,不过我走了不同的方向。最后我得到了……
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则保持不变。
你可以使用 logging.disable
这个功能,下面的代码可以确保 logging.INFO
及以下的日志都被禁用:
logging.disable(logging.INFO)
根据文档的说明:
这个功能的作用是禁用所有级别为 lvl 及以下的日志调用。如果你用 INFO 这个值来调用它,那么所有 INFO 和 DEBUG 级别的日志都会被丢弃,而 WARNING 级别及以上的日志则会按照日志记录器的有效级别进行处理。
如果你想要恢复之前的设置,可以调用:
logging.disable(logging.NOTSET)