记录

注意

scrapy.log已经被弃用,其功能有利于显式调用Python标准日志记录。继续阅读,了解有关新记录系统的更多信息。

Scrapy使用Python的内置日志记录系统进行事件日志记录。我们将提供一些简单的例子来开始使用,但是对于更高级的用例,强烈建议您彻底阅读其文档。

记录工作开箱即用,并且可以在某些程度上使用记录设置中列出的Scrapy设置进行配置。

Scraging调用scrapy.utils.log.configure_logging()来设置一些合理的默认值,并在运行命令时处理记录设置中的这些设置,因此如果您正在从脚本运行Scrapy中描述的脚本,建议手动调用它。

日志级别

Python的内置日志记录定义了5个不同的级别,以指示给定日志消息的严重性。这是标准的,按顺序列出:

  1. logging.CRITICAL - 对于严重错误(最高严重性)
  2. logging.ERROR - 常规错误
  3. logging.WARNING - 用于警告消息
  4. logging.INFO - 用于提供信息
  5. 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。

results matching ""

    No results matching ""