如何调整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
相关产品推荐
相关产品推荐

