如何关闭 Python requests 库输出的日志?
requests 的日志来自它自己和底层 urllib3,把这两个 logger 的级别设为 WARNING 即可静音。本文给出代码写法和 Django settings 配置方式。
requests 的调试日志由 requests 和 urllib3 两个 logger 产生,把它们的级别提升到 WARNING 就不会再刷 INFO/DEBUG 消息。
代码中设置
import logging
logging.getLogger("requests").setLevel(logging.WARNING)
logging.getLogger("urllib3").setLevel(logging.WARNING)
实际刷屏的主要是 urllib3 的连接池日志(Starting new HTTPS connection...),常规配置下调高 urllib3 级别可减少噪音,但显式设级别的子 logger 和独立 handler 仍需检查。
Django 项目:在 settings.py 配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'request_console': {'class': 'logging.StreamHandler', 'level': 'WARNING'},
},
'loggers': {
'urllib3': {
'handlers': ['request_console'],
'level': 'WARNING',
'propagate': False,
},
'requests': {
'handlers': ['request_console'],
'level': 'WARNING',
'propagate': False,
},
},
}
原理解释
Python 的 logging 按 logger 名称分层(urllib3.connectionpool 是 urllib3 的子 logger)。子 logger 级别为 NOTSET 时才继承父级的有效级别;已创建的记录向上传播时不会重新检查祖先 logger 的级别,handler 级别才继续过滤。示例 handler 显式设 WARNING 后,DEBUG/INFO 可在输出端被过滤,警告和错误仍然保留——这正是你想要的行为。
常见问题(FAQ)
Q:设了 WARNING 还是有输出?
A:检查是否有代码调用了 logging.basicConfig(level=logging.DEBUG),或第三方库自己加了 handler。也可以顺便把 urllib3.connectionpool 单独设级别。
Q:会不会把真正的错误也藏掉?
A:WARNING 阈值允许 WARNING/ERROR,但 requests 的连接失败和超时通常作为异常交给调用方,不保证库自动记录 ERROR;应用仍需处理并记录所需失败。
Q:只想临时静音一次请求?
A:调级别是进程共享状态,不是单请求隔离;并发场景应使用请求上下文过滤器,而不能简单临时修改全局级别;但更常见的需求是全局调一次,放在应用入口即可。
[1]: 观测云文档《Python 日志最佳实践相关集成》https://docs.guance.com/integrations/integration-index/