You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:50:23