记录
注意
scrapy.log已经被弃用,其功能有利于显式调用Python标准日志记录。继续阅读,了解有关新记录系统的更多信息。
Scrapy使用Python的内置日志记录系统进行事件日志记录。我们将提供一些简单的例子来开始使用,但是对于更高级的用例,强烈建议您彻底阅读其文档。
记录工作开箱即用,并且可以在某些程度上使用记录设置中列出的Scrapy设置进行配置。
Scraging调用scrapy.utils.log.configure_logging()来设置一些合理的默认值,并在运行命令时处理记录设置中的这些设置,因此如果您正在从脚本运行Scrapy中描述的脚本,建议手动调用它。
日志级别
Python的内置日志记录定义了5个不同的级别,以指示给定日志消息的严重性。这是标准的,按顺序列出:
- logging.CRITICAL - 对于严重错误(最高严重性)
- logging.ERROR - 常规错误
- logging.WARNING - 用于警告消息
- logging.INFO - 用于提供信息
- logging.DEBUG - 用于调试消息(最低严重性)
如何记录消息
以下是使用logging.WARNING级别登录邮件的快速示例:
import logging
logging.warning("This is a warning")
在任何一个标准的5个级别都有用于发出日志消息的快捷键,还有一个通用的logging.log方法,它将一个给定的级别作为参数。如果需要,最后一个例子可以重写为:
import logging
logging.log(logging.WARNING, "This is a warning")
最重要的是,您可以创建不同的“记录器”来封装消息。 (例如,通常的做法是为每个模块创建不同的记录器)。这些记录器可以独立配置,并允许分层结构。
以前的例子使用了幕后的根记录器,这是一个顶层的记录器,其中所有的消息被传播到(除非另有说明)。使用日志记录助手只是一个明确获取根记录器的快捷方式,所以这也是最后一个代码片段的一部分:
import logging
logger = logging.getLogger()
logger.warning("This is a warning")
您可以通过使用logging.getLogger函数获取其名称来使用其他记录器:
import logging
logger = logging.getLogger('mycustomlogger')
logger.warning("This is a warning")
最后,您可以通过使用__name__变量来确保您正在处理的任何模块的自定义记录器,该变量填充有当前模块的路径:
import logging
logger = logging.getLogger(__name__)
logger.warning("This is a warning")
也可以看看
模块日志记录,HowTo
基础日志教程
模块日志记录器
有关记录器的进一步文档
从蜘蛛登录
Scrapy在每个Spider实例中提供了一个记录器,可以像这样访问和使用:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://scrapinghub.com']
def parse(self, response):
self.logger.info('Parse function called on %s', response.url)
该记录器是使用Spider的名称创建的,但您可以使用任何您想要的自定义Python日志记录器。例如:
import logging
import scrapy
logger = logging.getLogger('mycustomlogger')
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://scrapinghub.com']
def parse(self, response):
logger.info('Parse function called on %s', response.url)
记录配置
Logger自己不管理如何显示通过它们发送的消息。对于此任务,可以将不同的“处理程序”附加到任何记录器实例,并将它们重定向到适当的目的地,例如标准输出,文件,电子邮件等。
默认情况下,Scrapy会根据以下设置设置并配置根记录器的处理程序。
记录设置
这些设置可用于配置日志记录:
LOG_FILE
LOG_ENABLED
LOG_ENCODING
LOG_LEVEL
LOG_FORMAT
LOG_DATEFORMAT
LOG_STDOUT
LOG_SHORT_NAMES
第一对设置定义日志消息的目的地。如果设置了LOG_FILE,则通过根记录器发送的消息将被重定向到一个名为LOG_FILE的文件,其编码为LOG_ENCODING。如果未设置并且LOG_ENABLED为True,则日志消息将显示在标准错误上。最后,如果LOG_ENABLED为False,则不会有任何可见的日志输出。
LOG_LEVEL决定要显示的最低严重级别,那些严重级别较低的消息将被过滤掉。它可以通过Log级别中列出的可能级别进行。
LOG_FORMAT和LOG_DATEFORMAT指定用作所有消息布局的格式化字符串。这些字符串可以分别包含日志记录的logrecord属性docs和datetime的strftime和strptime指令中列出的所有占位符。
如果设置了LOG_SHORT_NAMES,则日志将不会显示打印日志的scrapy组件。默认情况下未设置,因此日志包含负责该日志输出的scrapy组件。
命令行选项
有可用于所有命令的命令行参数,可用于覆盖有关日志记录的某些Scrapy设置。
- --logofile File
覆盖LOG_FILE
- --loglevel / -L LEVEL
覆盖LOG_LEVEL
- --nolog
将LOG_ENABLED设置为False
也可以看看
模块登录
有关可用处理程序的进一步文档
高级定制
因为Scrapy使用stdlib日志记录模块,您可以使用stdlib日志记录的所有功能自定义日志记录。
例如,假设您正在抓取一个返回许多HTTP 404和500个响应的网站,并且您想隐藏所有这样的消息:
2016-12-16 22:00:06 [scrapy.spidermiddlewares.httperror] INFO: Ignoring
response <500 http://quotes.toscrape.com/page/1-34/>: HTTP status code
is not handled or not allowed
首先要注意的是一个记录器名称 - 它在括号中:[scrapy.spidermiddlewares.httperror]。如果您只是[scrapy],则LOG_SHORT_NAMES可能设置为True;将其设置为False并重新运行爬网。
接下来,我们可以看到消息具有INFO级别。要隐藏它,我们应该设置高于INFO的scrapy.spidermiddlewares.httperror的记录级别; INFO为WARNING后的下一级。可以这样做。在蜘蛛的__init__方法中:
import logging
import scrapy
class MySpider(scrapy.Spider):
# ...
def __init__(self, *args, **kwargs):
logger = logging.getLogger('scrapy.spidermiddlewares.httperror')
logger.setLevel(logging.WARNING)
super().__init__(*args, **kwargs)
如果再次运行这个蜘蛛,那么来自scrapy.spidermiddlewares.httperror logger的INFO消息将会消失。
scrapy.utils.log模块
scrapy.utils.log.configure_logging(settings = None,install_root_handler = True)
初始化Scrapy的日志记录默认值。
参数:
设置(dict,设置对象或无) - 用于创建和配置根记录器的处理程序的设置(默认值:无)。
install_root_handler(bool) - 是否安装根日志处理程序(默认值:True)
此功能有:
通过Python标准日志记录路由警告和扭曲日志记录
分别将DEBUG和ERROR等级分配给Scrapy和Twisted记录器
如果LOG_STDOUT设置为True,则路由stdout进行日志记录
当install_root_handler为True(默认)时,此函数还根据给定的设置创建根记录器的处理程序(请参阅日志记录设置)。您可以使用设置参数覆盖默认选项。当设置为空或无,使用默认值。
使用Scrapy命令时会自动调用configure_logging,但在运行自定义脚本时需要显式调用。在这种情况下,它的使用不是必需的,但建议。
如果您计划自己配置处理程序,仍然建议您调用此函数,传递install_root_handler = False。在这种情况下,请记住默认情况下不会设置任何日志输出。
为了让您开始手动配置日志输出,您可以使用logging.basicConfig()设置基本的根处理程序。这是一个关于如何将INFO或更高邮件重定向到文件的示例:
import logging
from scrapy.utils.log import configure_logging
configure_logging(install_root_handler=False)
logging.basicConfig(
filename='log.txt',
format='%(levelname)s: %(message)s',
level=logging.INFO
)
有关使用Scrapy的更多详细信息,请参阅从脚本运行Scrapy。