我自己经常在自己的脚本开头使用logging.basicConfig(level=logging.DEBUG)初始化logging库,但是随之而来的就是requests会输出大量日志,甚至盖过了我自己的内容。所以我打算抑制requests的日志。
综合搜索的资料,和探索源代码,我发现:
- 其实requests代码里根本就没有调用任何logging/logger,甚至它还在__init__.py里给“自己的”logger设置了NullHandler
- docs/api.rst 文档里其实讲了怎么“配置”日志,只是没有“supress”这个词,以至于我没搜到
- 通过在Format里加上%(name)s,可以发现写日志的其实是urllib3.connectionpool
所以只需要在basicConfig后面加一句
logging.getLogger(“urllib3”).setLevel(logging.WARNING)
就可以抑制这部分日志了。
另外,logging.Logger.manager.loggerDict是个好东西,可以检查当前到底存在哪些logger。通过检查loggerDict[‘urllib3.connectionpool’].propagate发现其为True,其上层也是True,因此,虽然这两层logger一个没handler,一个NullHandler,但是该logger记录的日志消息仍会逐层上传,最终被basicConfig的root logger处理。