译者:OSGeo 中国
注解
scrapy.log
已经不赞成与函数一起使用,而赞成显式调用Python标准日志记录。继续阅读以了解有关新日志记录系统的更多信息。
Scrapy 用途 Python’s builtin logging system 用于事件日志记录。我们将提供一些简单的示例来帮助您入门,但对于更高级的用例,强烈建议您仔细阅读其文档。
日志记录是开箱即用的,可以在某种程度上使用中列出的碎片设置进行配置。 日志记录设置 .
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")
参见
模块日志记录,
基本日志教程
模块日志记录,
关于伐木工人的进一步文件
从 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_ENABLED
是 True
,将在标准错误上显示日志消息。最后,如果 LOG_ENABLED
是 False
,将不会有任何可见的日志输出。
LOG_LEVEL
确定要显示的最低严重性级别,将筛选出严重性较低的消息。它的范围包括 日志级别 .
LOG_FORMAT
和 LOG_DATEFORMAT
指定用作所有消息布局的格式字符串。这些字符串可以包含中列出的任何占位符 logging’s logrecord attributes docs 和 datetime’s strftime and strptime directives 分别。
如果 LOG_SHORT_NAMES
设置后,日志将不会显示打印日志的 Scrapy 组件。默认情况下,它是未设置的,因此日志包含负责该日志输出的废料组件。
命令行选项
有一些命令行参数可用于所有命令,您可以使用这些参数来覆盖有关日志记录的一些零碎设置。
--logfile 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并重新运行爬网。
接下来,我们可以看到消息具有信息级别。为了隐藏它,我们应该为 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 orNone
) — 用于创建和配置根记录器处理程序的设置(默认值:无)。 - 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的更多详细信息。