登录

注解

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

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

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

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

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

参见

模块日志记录, HowTo

基本日志教程

模块日志记录, Loggers

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

从蜘蛛记录

scrapy提供了一个 logger 在每个Spider实例中,可以按如下方式访问和使用::

import scrapy

class MySpider(scrapy.Spider):

    name = 'myspider'
    start_urls = ['https://scrapy.org']

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

这个记录器是使用蜘蛛的名称创建的,但是您可以使用任何您想要的自定义Python记录器。例如::

import logging
import scrapy

logger = logging.getLogger('mycustomlogger')

class MySpider(scrapy.Spider):

    name = 'myspider'
    start_urls = ['https://scrapy.org']

    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 则日志将不显示打印日志的废组件。默认情况下,它是未设置的,因此日志包含负责该日志输出的废弃组件。

命令行选项

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

参见

模块 logging.handlers

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

自定义日志格式

可以通过扩展为不同的操作设置自定义日志格式 LogFormatter 课程和制作 LOG_FORMATTER 指向你的新班级。

class scrapy.logformatter.LogFormatter[源代码]

用于为不同操作生成日志消息的类。

所有方法都必须返回一个列出参数的字典 levelmsgargs 调用时将用于构造日志消息 logging.log .

方法输出的字典键:

  • level 是该操作的日志级别,可以使用 python logging librarylogging.DEBUGlogging.INFOlogging.WARNINGlogging.ERRORlogging.CRITICAL .

  • msg 应该是可以包含不同格式占位符的字符串。此字符串,格式为 args ,将是该行动的长期信息。

  • args 应该是一个tuple或dict,其中的格式占位符为 msg .最后的日志消息计算为 msg % args .

用户可以定义自己的 LogFormatter 如果要自定义每个操作的日志记录方式,或者希望完全忽略它,则初始化。为了省略记录操作,该方法必须返回 None .

以下是有关如何创建自定义日志格式化程序以降低从管道中删除项时日志消息的严重性级别的示例:

class PoliteLogFormatter(logformatter.LogFormatter):
    def dropped(self, item, exception, response, spider):
        return {
            'level': logging.INFO, # lowering the level from logging.WARNING
            'msg': "Dropped: %(exception)s" + os.linesep + "%(item)s",
            'args': {
                'exception': exception,
                'item': item,
            }
        }
crawled(request, response, spider)[源代码]

当爬虫找到网页时记录一条消息。

download_error(failure, request, spider, errmsg=None)[源代码]

记录来自spider的下载错误消息(通常来自引擎)。

2.0 新版功能.

dropped(item, exception, response, spider)[源代码]

当某个项在通过项管道时被丢弃时,记录该消息。

item_error(item, exception, response, spider)[源代码]

当一个项目在通过项目管道时出错时,记录消息。

2.0 新版功能.

scraped(item, response, spider)[源代码]

当一个项目被蜘蛛抓取时记录一条消息。

spider_error(failure, request, response, spider)[源代码]

记录来自spider的错误消息。

2.0 新版功能.

高级自定义

因为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 高于信息;信息后的下一级是警告。可以这样做,例如在蜘蛛的 __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 日志记录器将消失。

您也可以通过以下方式来过滤日志记录 LogRecord 数据。例如,您可以使用子串或正则表达式按消息内容进行过滤日志记录。创建 logging.Filter 子类并为其配备正则表达式模式,以便过滤发出不需要的消息::

import logging
import re

class ContentFilter(logging.Filter):
    def filter(self, record):
        match = re.search(r'\d{3} [Ee]rror, retrying', record.message)
        if match:
            return False

项目级别的过滤可以附加到由Scrapy创建的根处理程序,这是对项目不同部分(中间件、蜘蛛等)的所有记录器进行过滤的一种便捷方式::

import logging
import scrapy

class MySpider(scrapy.Spider):
    # ...
    def __init__(self, *args, **kwargs):
        for handler in logging.root.handlers:
            handler.addFilter(ContentFilter())

或者,您也可以选择特定的记录器并将其隐藏,而不会影响其他记录器:

import logging
import scrapy

class MySpider(scrapy.Spider):
    # ...
    def __init__(self, *args, **kwargs):
        logger = logging.getLogger('my_logger')
        logger.addFilter(ContentFilter())

scrapy.utils.log模块