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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:23:29