Logging

Note

不推荐使用scrapy.log及其功能,而支持显式调用Python标准日志记录. 继续阅读以了解有关新日志系统的更多信息.

Scrapy使用Python的内置日志记录系统进行事件记录. 我们将提供一些简单的示例来帮助您入门,但是对于更高级的用例,强烈建议您仔细阅读其文档.

开箱即用地进行日志记录 ,并且可以使用" 日志记录设置"中列出的Scrapy设置进行某种程度的配置 .

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

Log levels

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

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

How to log messages

这里有一个如何使用记录的消息一个简单的例子logging.WARNING级别:

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

There are shortcuts for issuing log messages on any of the standard 5 levels, and there’s also a general logging.log method which takes a given level as argument. If needed, the last example could be rewritten as:

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

最重要的是,您可以创建不同的"记录器"来封装消息. (例如,一种常见的做法是为每个模块创建不同的记录器). 这些记录器可以独立配置,并且允许分层构造.

The previous examples use the root logger behind the scenes, which is a top level logger where all messages are propagated to (unless otherwise specified). Using logging helpers is merely a shortcut for getting the root logger explicitly, so this is also an equivalent of the last snippets:

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

也可以看看

Module logging, HowTo
基本记录教程
Module logging, Loggers
有关记录器的更多文档

Logging from Spiders

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

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)

Logging configuration

记录器本身并不管理如何显示通过它们发送的消息. 对于此任务,可以将不同的"处理程序"附加到任何记录器实例,它们会将这些消息重定向到适当的目的地,例如标准输出,文件,电子邮件等.

默认情况下,Scrapy根据以下设置为根记录程序设置并配置处理程序.

Logging settings

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

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

LOG_LEVEL确定要显示的最低严重性级别,严重性较低的那些消息将被过滤掉. 它涵盖了日志级别中列出的可能级别 .

LOG_FORMATLOG_DATEFORMAT指定用作所有消息的布局的格式化字符串. 这些字符串可以包含分别在日志记录的logrecord属性docsdatetime的strftime和strptime指令中列出的任何占位符.

如果设置了LOG_SHORT_NAMES ,则日志将不会显示打印日志的scrapy组件. 默认情况下未设置它,因此日志包含负责该日志输出的scrapy组件.

Command-line options

有一些命令行参数可用于所有命令,您可以使用它们来覆盖一些有关日志记录的Scrapy设置.

也可以看看

Module logging.handlers
有关可用处理程序的更多文档

Custom Log Formats

通过扩展LogFormatter类并将LOG_FORMATTER指向您的新类,可以为不同的操作设置自定义日志格式.

class scrapy.logformatter.LogFormatter

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

所有方法都必须返回一个字典,其中列出了参数levelmsgargs ,这些args将在调用logging.log时用于构造日志消息.

方法输出的字典键:

  • level是该操作的日志级别,您可以使用python日志记录库中的日志级别: logging.DEBUGlogging.INFOlogging.WARNINGlogging.ERRORlogging.CRITICAL .
  • msg应该是可以包含不同格式占位符的字符串. 用提供的args格式化的字符串将成为该操作的长消息.
  • args应该是具有msg格式占位符的元组或dict. 最终的日志消息以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': u"Dropped: %(exception)s" + os.linesep + "%(item)s",
            'args': {
                'exception': exception,
                'item': item,
            }
        }
crawled(request, response, spider)

搜寻器找到网页时记录一条消息.

dropped(item, exception, response, spider)

在某项通过项目管道传递时被删除时记录一条消息.

scraped(item, response, spider)

蜘蛛抓取物品时记录一条消息.

Advanced customization

由于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级别. 要隐藏它,我们应该将scrapy.spidermiddlewares.httperror日志记录级别设置为高于INFO; INFO为警告后的下一级. 例如,可以在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)

如果再次运行此蜘蛛,则来自scrapy.spidermiddlewares.httperror记录器的INFO消息将消失.

scrapy.utils.log module

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

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

Parameters:
  • 设置 (dict, Settings对象或None )–用于为根记录器创建和配置处理程序的设置(默认值:无).
  • install_root_handlerbool )–是否安装根日志记录处理程序(默认值:True)

该功能可以:

  • 通过Python标准日志记录路由警告和扭曲日志记录
  • 将DEBUG和ERROR级别分别分配给Scrapy和Twisted记录器
  • 如果LOG_STDOUT设置为True,则将stdout路由到日志

install_root_handler为True(默认值)时,此函数还会根据给定的设置为root记录器创建一个处理程序(请参阅记录设置 ). 您可以使用settings参数覆盖默认选项. 当settings为空或无时,使用默认值.

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

如果仍然建议您自己配置处理程序,则建议您调用此函数,并传递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 .