Scrapy如何为终端(标准输出)与日志文件设置不同日志级别
为Scrapy分别设置终端与文件日志级别
Scrapy默认的LOG_LEVEL配置会同时作用于终端和文件日志,要实现终端输出INFO级别、文件记录ERROR级别的需求,需要借助Python标准logging模块自定义日志处理器,具体步骤如下:
1. 调整基础配置(settings.py)
先将全局日志级别设为更低的INFO(确保终端能输出INFO及以上日志),并注释掉原有的LOG_FILE配置:
LOG_LEVEL = 'INFO' LOG_FORMAT = '%(levelname)s - %(message)s' # 注释掉默认文件日志配置,改用自定义处理器 # LOG_FILE = './log.txt'
2. 自定义日志处理器(全局生效方案)
创建项目级的日志扩展,让所有爬虫都应用该配置:
步骤2.1 创建扩展文件
在项目根目录下新建extensions.py,添加以下代码:
import logging from scrapy import signals from scrapy.extensions.logstats import LogStats class CustomLogSetup: @classmethod def from_crawler(cls, crawler): # 获取Scrapy根日志器 scrapy_logger = logging.getLogger('scrapy') # 移除默认日志处理器,避免重复输出 for handler in scrapy_logger.handlers[:]: scrapy_logger.removeHandler(handler) # 配置终端日志处理器(INFO级别) console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) formatter = logging.Formatter('%(levelname)s - %(message)s') console_handler.setFormatter(formatter) scrapy_logger.addHandler(console_handler) # 配置文件日志处理器(ERROR级别) file_handler = logging.FileHandler('./log.txt') file_handler.setLevel(logging.ERROR) file_handler.setFormatter(formatter) scrapy_logger.addHandler(file_handler) # 保留Scrapy默认的日志统计功能 logstats = LogStats(crawler) crawler.signals.connect(logstats.spider_closed, signal=signals.spider_closed) return cls()
步骤2.2 启用扩展
在settings.py中添加扩展配置:
EXTENSIONS = { '你的项目名称.extensions.CustomLogSetup': 500, # 500为优先级,确保早于其他日志扩展加载 }
3. 单爬虫生效方案(简化版)
如果只需针对单个爬虫配置,可直接在爬虫文件的__init__方法中设置:
import logging from scrapy import Spider class YourSpider(Spider): name = 'your_spider' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 获取Scrapy根日志器 scrapy_logger = logging.getLogger('scrapy') # 清理默认处理器 for handler in scrapy_logger.handlers[:]: scrapy_logger.removeHandler(handler) # 终端日志配置 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) formatter = logging.Formatter('%(levelname)s - %(message)s') console_handler.setFormatter(formatter) scrapy_logger.addHandler(console_handler) # 文件日志配置 file_handler = logging.FileHandler('./log.txt') file_handler.setLevel(logging.ERROR) file_handler.setFormatter(formatter) scrapy_logger.addHandler(file_handler) # 根日志器级别设为DEBUG,确保所有级别日志能被处理器过滤 scrapy_logger.setLevel(logging.DEBUG)
原理说明
Scrapy的日志系统基于Python标准logging模块,通过给根日志器添加不同的Handler(终端用StreamHandler,文件用FileHandler),可以分别为每个Handler设置独立的日志级别,从而实现终端与文件日志的分级输出。
内容的提问来源于stack exchange,提问作者Mah3sh
相关产品推荐
相关产品推荐

