Scrapy logging日志重复输出的解决方法

现状:
通过CrawlerProcess启动Scrapy后,因为外部配置了logging模块,造成在scrapy内输出日志时,会有重复日志被打印出来。通过日志的格式可以确定是由不同的handler进行输出的。

  1. 如果是完全在scrapy流程中的日志,一般有三种输出方式。
from scrapy.log import logger
logger.info("info")

# 会抛出warning,警告scrapy.log已经被废弃,此时的logger为 scrapy.log
# ScrapyDeprecationWarning: Module `scrapy.log` has been deprecated, Scrapy now relies on the builtin Python library for logging. Read the updated logging entry in the documentation to learn more.


import logging
logging.info("info")

# 直接使用logging模块输出日志,logger为root。但是当对logging模块进行配置之后,就会有可能出现日志重复打印的情况

self.logger.info("info")

# spider会创建logger属性,这时logger name为spider name, 推荐在scrapy流程中使用

  1. 当scrapy作为项目的一部分使用时,在scrapy流程之外往往会有对日志进行配置的需求,当直接对logging的属性进行配置后,在scrapy中再输出日志时就会发生重复打印的现象。

解决方案:

  1. 当单纯使用scrapy时,建议通过spider初始化后的logger属性直接输出日志。

  2. 如果除了scrapy只是整体项目的一部分,在scrapy的流程之外需要自定义日志时,推荐使用单独的logger进行日志的输出,并对logger进行属性的配置,避免其他logger的handler对日志进行处理。

logger = logging.getLogger(__name__)
formatter = logging.Formatter('%(asctime)s [%(name)s] %(levelname)s | %(message)s')
formatter.datefmt = '%Y-%m-%d %H:%M:%S'
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.setLevel("INFO")
logger.addHandler(handler)
logger.propagate = False

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值