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

你可能感兴趣的:(睡前读物Scrapy,爬虫,python)