登录¶
注解
scrapy.log
已经不赞成与函数一起使用,而赞成显式调用Python标准日志记录。继续阅读以了解有关新日志记录系统的更多信息。
零星用途 logging
用于事件日志记录。我们将提供一些简单的示例来帮助您入门,但对于更高级的用例,强烈建议您仔细阅读其文档。
日志记录是开箱即用的,可以在某种程度上使用中列出的 Scrapy 设置进行配置。 日志记录设置 .
Scrapy电话 scrapy.utils.log.configure_logging()
设置一些合理的默认值并在 日志记录设置 当运行命令时,建议在运行脚本的scrapy时手动调用它,如中所述。 从脚本中运行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")
除此之外,您还可以创建不同的“记录器”来封装消息。(例如,常见的做法是为每个模块创建不同的记录器)。这些记录器可以独立配置,并且允许层次结构。
前面的示例在后台使用根记录器,它是一个顶级记录器,所有消息都在其中传播(除非另有规定)。使用 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")
从蜘蛛记录¶
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_ENABLED
是 True
,日志消息将显示在标准错误上。如果 LOG_FILE
已设置,并且 LOG_FILE_APPEND
是 False
,则该文件将被覆盖(如果有,则丢弃以前运行的输出)。最后,如果 LOG_ENABLED
是 False
,则不会有任何可见的日志输出。
LOG_LEVEL
确定要显示的最低严重性级别,将筛选出严重性较低的消息。它的范围包括 日志级别 .
LOG_FORMAT
和 LOG_DATEFORMAT
指定用作所有消息布局的格式字符串。这些字符串可以包含中列出的任何占位符 logging's logrecord attributes docs 和 datetime's strftime and strptime directives 分别。
如果 LOG_SHORT_NAMES
则日志将不显示打印日志的废组件。默认情况下,它是未设置的,因此日志包含负责该日志输出的废弃组件。
命令行选项¶
有一些命令行参数可用于所有命令,您可以使用这些参数来覆盖有关日志记录的一些零碎设置。
--logfile FILE
重写
LOG_FILE
--loglevel/-L LEVEL
重写
LOG_LEVEL
--nolog
集合
LOG_ENABLED
到False
参见
- 模块
logging.handlers
有关可用处理程序的进一步文档
自定义日志格式¶
可以通过扩展为不同的操作设置自定义日志格式 LogFormatter
课程和制作 LOG_FORMATTER
指向你的新班级。
- class scrapy.logformatter.LogFormatter[源代码]¶
用于为不同操作生成日志消息的类。
所有方法都必须返回一个列出参数的字典
level
,msg
和args
调用时将用于构造日志消息logging.log
.方法输出的字典键:
level
是该操作的日志级别,可以使用 python logging library :logging.DEBUG
,logging.INFO
,logging.WARNING
,logging.ERROR
和logging.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, } }
高级自定义¶
因为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())