如何将DEBUG日志写入文件并屏蔽控制台输出,捕获requests连接日志
解决方案
要实现将requests的DEBUG日志写入文件且控制台无任何输出,需从以下几个方面调整代码:
核心问题分析
原代码存在两个关键问题:
logging.basicConfig默认会添加控制台输出处理器(StreamHandler),导致所有符合级别要求的日志会打印到控制台;requests底层依赖的urllib3模块会生成独立的DEBUG日志,这类日志不会自动流向你自定义的_developertest_loglogger。
具体调整步骤
- 移除
logging.basicConfig的自动控制台处理器:直接不依赖basicConfig,手动管理所有日志处理器; - 为
urllib3的logger添加文件处理器,确保其生成的DEBUG日志能写入目标文件; - 删除或注释所有
print语句,避免控制台输出非日志内容; - 关闭所有logger的日志传播,防止日志重复输出或流向控制台。
完整修改后的代码
import logging import datetime import requests import warnings def log_file(log_name): log_day = datetime.datetime.now().strftime('%d-%m-%Y') log_name = '/sample1/log_basics/' + log_day + "_" + log_name return log_name # 创建统一的文件处理器,用于所有日志写入 log_handler = logging.FileHandler(log_file("_developertest_log.log")) log_handler.setLevel(logging.DEBUG) log_handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(message)s')) # 配置自定义业务logger custom_logger = logging.getLogger("_developertest_log") custom_logger.setLevel(logging.DEBUG) custom_logger.propagate = False custom_logger.addHandler(log_handler) # 配置urllib3的logger(requests底层依赖),捕获其DEBUG日志 urllib3_logger = logging.getLogger("urllib3") urllib3_logger.setLevel(logging.DEBUG) urllib3_logger.propagate = False urllib3_logger.addHandler(log_handler) # 清空根logger的默认处理器,彻底杜绝控制台输出 root_logger = logging.getLogger() for handler in root_logger.handlers[:]: root_logger.removeHandler(handler) def process2(abc): # 注释原有print语句,避免控制台输出 # print("Going to check: "+str(abc)) custom_logger.info("Going to check test1: "+str(abc)) x = requests.get('https://w3schools.com/python/demopage.htm') # 注释原有print语句,避免控制台输出 # print(x.text) abc = "68485" process2(abc)
效果验证
运行修改后的代码:
- 控制台无任何输出内容;
- 指定路径的日志文件中会同时包含自定义业务的INFO日志,以及
urllib3生成的DEBUG日志(形如2024-04-02 11:42:05,369:DEBUG:Starting new HTTPS connection (1): w3schools.com:443)。
内容的提问来源于stack exchange,提问作者Tonin thomas
相关产品推荐
相关产品推荐

