如何在Scrapy中为不同模块设置日志级别并移除指定模块INFO日志
为Scrapy不同模块设置差异化日志级别(全局方案)
针对你有200+爬虫、无法逐个修改代码的场景,核心问题是Scrapy核心组件(如scrapy.crawler、scrapy.middleware)的日志初始化早于settings.py的完全加载,导致直接在settings.py中配置特定日志器级别无效。以下是无需修改单个爬虫的全局解决方案:
方案一:自定义Scrapy扩展(推荐)
通过Scrapy扩展在爬虫引擎启动前调整日志器级别,既能避开Settings加载顺序问题,又能全局生效。
1. 创建日志配置扩展
在项目目录下新建extensions/log_config.py,写入以下代码:
from scrapy import signals from scrapy.logformatter import LogFormatter import logging class CustomLogLevelExtension: def __init__(self): # 需要屏蔽/降级的冗余日志器 self.unwanted_loggers = [ 'scrapy.middleware', 'scrapy.crawler', 'scrapy.utils.log' ] # 需要保留的核心日志器(确保关键日志正常输出) self.important_loggers = [ 'scrapy.core.engine', # 请求发送、爬虫启停日志 'scrapy.spidermiddlewares.httperror', # 错误请求日志 'scrapy.pipelines', # Item处理日志 'your_project_name.spiders' # 爬虫自身业务日志(按需启用) ] @classmethod def from_crawler(cls, crawler): ext = cls() # 绑定引擎启动信号,在日志大量输出前调整级别 crawler.signals.connect(ext.adjust_log_levels, signal=signals.engine_started) return ext def adjust_log_levels(self): # 降级冗余日志器级别(仅保留WARNING及以上) for logger_name in self.unwanted_loggers: logger = logging.getLogger(logger_name) logger.setLevel(logging.WARNING) # 若需完全屏蔽,可添加NullHandler并关闭传播 # logger.addHandler(logging.NullHandler()) # logger.propagate = False # 确保核心日志器输出关键信息(级别设为INFO/DEBUG) for logger_name in self.important_loggers: logger = logging.getLogger(logger_name) logger.setLevel(logging.INFO) # 可选:自定义日志格式,确保Item和请求日志清晰 class CustomItemLogFormatter(LogFormatter): def crawled(self, request, response, spider): return { 'level': logging.INFO, 'msg': f'Crawled {response.status} <{request.url}>', 'args': () } def scraped(self, item, response, spider): return { 'level': logging.INFO, 'msg': f'Scraped item from <{response.url}>', 'args': () }
2. 在settings.py中启用扩展和配置
修改项目的settings.py,添加以下配置:
# 启用自定义日志扩展 EXTENSIONS = { 'your_project_name.extensions.log_config.CustomLogLevelExtension': 500, # 中等优先级确保早加载 } # 配置全局日志输出到文件 LOG_FILE = 'scrapy_crawl.log' LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' LOG_DATEFORMAT = '%Y-%m-%d %H:%M:%S' # 可选:启用自定义日志格式 LOG_FORMATTER = 'your_project_name.extensions.log_config.CustomItemLogFormatter'
方案二:自定义启动脚本(备选)
如果扩展方式仍有问题,可以通过自定义启动脚本提前配置日志,不过需要修改项目启动方式:
在项目根目录新建start_crawl.py:
import logging from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings # 提前调整日志器级别 unwanted_loggers = ['scrapy.middleware', 'scrapy.crawler', 'scrapy.utils.log'] for logger_name in unwanted_loggers: logger = logging.getLogger(logger_name) logger.setLevel(logging.WARNING) # 启动爬虫 settings = get_project_settings() process = CrawlerProcess(settings) # 若要启动所有爬虫,可遍历spiders模块 from your_project_name.spiders import * for spider_cls in Spider1, Spider2, ...: # 或通过爬虫名称加载 process.crawl(spider_cls) process.start()
之后通过python start_crawl.py启动爬虫,替代原有的scrapy crawl命令。
验证效果
启动爬虫后查看scrapy_crawl.log,应该只会保留请求发送、错误信息、Item爬取等关键日志,scrapy.middleware等模块的冗余DEBUG/INFO级日志会被过滤。
内容的提问来源于stack exchange,提问作者Yoyoda
相关产品推荐
相关产品推荐

