现状:
通过CrawlerProcess启动Scrapy后,因为外部配置了logging模块,造成在scrapy内输出日志时,会有重复日志被打印出来。通过日志的格式可以确定是由不同的handler进行输出的。
- 如果是完全在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流程中使用
- 当scrapy作为项目的一部分使用时,在scrapy流程之外往往会有对日志进行配置的需求,当直接对logging的属性进行配置后,在scrapy中再输出日志时就会发生重复打印的现象。
解决方案:
-
当单纯使用scrapy时,建议通过spider初始化后的logger属性直接输出日志。
-
如果除了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
版权声明:本文为okm6666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。