如何关闭 Python requests 库输出的日志?

requests 的日志来自它自己和底层 urllib3,把这两个 logger 的级别设为 WARNING 即可静音。本文给出代码写法和 Django settings 配置方式。

最佳实践
如何关闭 Python requests 库输出的日志?封面

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/

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台