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

如何调整Scrapy日志行宽以取消自动换行?

解决Scrapy日志行宽限制的可行方案

针对Scrapy 2.13.3版本日志默认80字符换行的问题,以下是几个可落地的调整方案:

1. 全局覆盖pprint默认参数

Scrapy内部多处依赖pprint模块格式化日志内容,直接修改pprint的全局默认配置,可一次性解决所有场景的行宽限制:

# 在项目settings.py或爬虫启动文件中添加
import pprint
# 修改默认行宽为1000,开启紧凑模式
pprint._DEFAULT_WIDTH = 1000
pprint._DEFAULT_COMPACT = True

此方法会让所有调用pprint的代码都使用新的行宽设置,包括Scrapy内部的日志输出逻辑。

2. 完整自定义LogFormatter覆盖所有日志场景

你之前仅修改了dropped方法,但Scrapy的LogFormatter还有item_scraped、process_item等多个日志生成方法,需要逐一覆盖才能全场景生效:

# 项目中新建utils.py,添加自定义LogFormatter
import logging
import pprint
from scrapy.logformatter import LogFormatter

class CustomLogFormatter(LogFormatter):
    def dropped(self, item, exception, response=None, spider=None):
        item_str = pprint.pformat(item, width=1000, compact=True)
        return {
            'level': logging.INFO,
            'msg': "Dropped: %(exception)s\n%(item)s",
            'args': {
                'exception': exception,
                'item': item_str,
            }
        }
    
    def item_scraped(self, item, response, spider):
        item_str = pprint.pformat(item, width=1000, compact=True)
        return {
            'level': logging.DEBUG,
            'msg': "Scraped from %(response)s\n%(item)s",
            'args': {
                'response': response,
                'item': item_str,
            }
        }
    
    # 按需覆盖其他日志方法,比如process_item、log等

然后在settings.py中配置启用自定义Formatter:

LOG_FORMATTER = '你的项目名.utils.CustomLogFormatter'

3. 自定义logging.Formatter禁用自动换行

若日志换行是Python logging模块的Formatter自动处理导致的,可自定义Formatter关闭换行逻辑,同时将日志输出到文件:

# 在爬虫启动文件中添加日志配置
import logging
from scrapy.utils.log import configure_logging

class NoWrapFormatter(logging.Formatter):
    def format(self, record):
        # 跳过logging默认的换行截断逻辑,保留原始消息格式
        record.message = record.getMessage()
        if self.usesTime():
            record.asctime = self.formatTime(record, self.datefmt)
        s = self.formatMessage(record)
        if record.exc_info and not record.exc_text:
            record.exc_text = self.formatException(record.exc_info)
        if record.exc_text:
            s += '\n' + record.exc_text
        if record.stack_info:
            s += '\n' + self.formatStack(record.stack_info)
        return s

# 重新配置Scrapy日志
configure_logging(install_root_handler=False)
logger = logging.getLogger('scrapy')
# 日志输出到文件
file_handler = logging.FileHandler('scrapy_output.log')
file_handler.setFormatter(NoWrapFormatter('%(asctime)s [%(name)s] %(levelname)s: %(message)s'))
logger.addHandler(file_handler)
logger.setLevel(logging.DEBUG)

4. 临时修改Scrapy源码(不推荐)

如果上述方法均无效,可临时修改Scrapy源码中scrapy/logformatter.py文件里的pprint调用,手动添加width=1000参数。但此方法依赖Scrapy版本,升级后需重新修改,仅适合临时测试场景。


内容的提问来源于stack exchange,提问作者JReekes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 19:12:06