译者:OSGeo 中国

注解

scrapy.log 已经不赞成与函数一起使用,而赞成显式调用Python标准日志记录。继续阅读以了解有关新日志记录系统的更多信息。

Scrapy 用途 Python’s builtin logging system 用于事件日志记录。我们将提供一些简单的示例来帮助您入门,但对于更高级的用例,强烈建议您仔细阅读其文档。

日志记录是开箱即用的,可以在某种程度上使用中列出的碎片设置进行配置。 日志记录设置 .

Scrapy电话 scrapy.utils.log.configure_logging() 设置一些合理的默认值并在 日志记录设置 当运行命令时,建议在运行脚本的scrapy时手动调用它,如中所述。 从脚本中运行Scrapy .

日志级别

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

  1. logging.CRITICAL -对于严重错误(严重性最高)
  2. logging.ERROR -对于常规错误
  3. logging.WARNING -用于警告消息
  4. logging.INFO -以获取信息性消息
  5. logging.DEBUG -用于调试消息(最低严重性)

如何记录消息

下面是如何使用 logging.WARNING

  1. import logging
  2. logging.warning("This is a warning")

在标准的5个级别中,有一个用于发布日志消息的快捷方式,还有一个常规的 logging.log 方法,该方法将给定的级别作为参数。如果需要,最后一个示例可以重写为:

import logging
logging.log(logging.WARNING, "This is a warning")

除此之外,您还可以创建不同的“记录器”来封装消息。(例如,常见的做法是为每个模块创建不同的记录器)。这些记录器可以独立配置,并且允许层次结构。

前面的示例在后台使用根记录器,它是一个顶级记录器,所有消息都在其中传播(除非另有规定)。使用 logging 帮助程序只是显式获取根记录器的快捷方式,因此这也相当于最后一段代码:

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")

参见

模块日志记录,

基本日志教程

模块日志记录,

关于伐木工人的进一步文件

从 Spider 记录

Scrapy提供了 logger 在每个 Spider 实例中,可以这样访问和使用:

import scrapy

class MySpider(scrapy.Spider):

    name = 'myspider'
    start_urls = ['https://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 = ['https://scrapinghub.com']

    def parse(self, response):
        logger.info('Parse function called on %s', response.url)

日志记录配置

日志记录者自己不管理如何显示通过它们发送的消息。对于此任务,可以将不同的“处理程序”附加到任何记录器实例,它们将这些消息重定向到适当的目标,例如标准输出、文件、电子邮件等。

默认情况下,scrappy根据下面的设置为根记录器设置和配置处理程序。

日志记录设置

这些设置可用于配置日志记录:

前两个设置定义日志消息的目标。如果 LOG_FILE 设置后,通过根记录器发送的消息将被重定向到名为 LOG_FILE 带编码 LOG_ENCODING . 如果未设置 LOG_ENABLEDTrue ,将在标准错误上显示日志消息。最后,如果 LOG_ENABLEDFalse ,将不会有任何可见的日志输出。

LOG_LEVEL 确定要显示的最低严重性级别,将筛选出严重性较低的消息。它的范围包括 日志级别 .

LOG_FORMATLOG_DATEFORMAT 指定用作所有消息布局的格式字符串。这些字符串可以包含中列出的任何占位符 logging’s logrecord attributes docsdatetime’s strftime and strptime directives 分别。

如果 LOG_SHORT_NAMES 设置后,日志将不会显示打印日志的 Scrapy 组件。默认情况下,它是未设置的,因此日志包含负责该日志输出的废料组件。

命令行选项

有一些命令行参数可用于所有命令,您可以使用这些参数来覆盖有关日志记录的一些零碎设置。

  • --logfile FILE
    


重写 LOG_FILE

  • --loglevel/-L LEVEL
    


重写 LOG_LEVEL

  • --nolog
    


集合 LOG_ENABLEDFalse

参见

模块

有关可用处理程序的进一步文档

高级自定义

因为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并重新运行爬网。

接下来,我们可以看到消息具有信息级别。为了隐藏它,我们应该为 scrapy.spidermiddlewares.httperror 高于信息;信息后的下一级是警告。可以这样做,例如在 Spider 的 __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)

如果您再次运行此 Spider ,则从 scrapy.spidermiddlewares.httperror 日志记录器将消失。

scrapy.utils.log模块

scrapy.utils.log.configure_logging(settings=None, install_root_handler=True)

初始化Scrapy的日志记录默认值。

| 参数: |

  • settings (dict, Settings object or None) — 用于创建和配置根记录器处理程序的设置(默认值:无)。
  • install_root_handler (bool) — 是否安装根日志记录处理程序(默认值:true) | | | —- |

此功能可以:

  • 通过python标准日志记录路由警告和扭曲日志记录
  • 分别将调试和错误级别分配给残缺和扭曲的记录器
  • 如果日志输出设置为真,则将stdout路由到日志

什么时候? install_root_handler 为true(默认值),此函数还根据给定的设置为根记录器创建处理程序(请参见 日志记录设置 )可以使用替代默认选项 settings 争论。什么时候? settings 为空或无,使用默认值。

configure_logging 在使用scrappy命令时自动调用,但在运行自定义脚本时需要显式调用。在这种情况下,不需要使用它,但建议使用它。

如果您计划自己配置处理程序,仍然建议您调用此函数,通过 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的更多详细信息。