Logging¶
Note
不推荐使用scrapy.log
及其功能,而支持显式调用Python标准日志记录. 继续阅读以了解有关新日志系统的更多信息.
Scrapy使用Python的内置日志记录系统进行事件记录. 我们将提供一些简单的示例来帮助您入门,但是对于更高级的用例,强烈建议您仔细阅读其文档.
开箱即用地进行日志记录 ,并且可以使用" 日志记录设置"中列出的Scrapy设置进行某种程度的配置 .
Scrapy调用scrapy.utils.log.configure_logging()
来设置一些合理的默认值,并在运行命令时在" 日志记录设置"中处理这些设置,因此,如果从脚本运行Scrapy(如从脚本中运行Scrapy中所述),建议手动调用.
Log levels¶
Python的内置日志记录定义了5个不同级别,以指示给定日志消息的严重性. 这是标准的,以降序排列:
logging.CRITICAL
严重错误(最高严重性)logging.ERROR
常规错误logging.WARNING
-用于警告消息logging.INFO
- for informational messageslogging.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")
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_ENABLED
为True
,则将在标准错误上显示日志消息. 最后,如果LOG_ENABLED
为False
,则不会有任何可见的日志输出.
LOG_LEVEL
确定要显示的最低严重性级别,严重性较低的那些消息将被过滤掉. 它涵盖了日志级别中列出的可能级别 .
LOG_FORMAT
和LOG_DATEFORMAT
指定用作所有消息的布局的格式化字符串. 这些字符串可以包含分别在日志记录的logrecord属性docs和datetime的strftime和strptime指令中列出的任何占位符.
如果设置了LOG_SHORT_NAMES
,则日志将不会显示打印日志的scrapy组件. 默认情况下未设置它,因此日志包含负责该日志输出的scrapy组件.
Command-line options¶
有一些命令行参数可用于所有命令,您可以使用它们来覆盖一些有关日志记录的Scrapy设置.
--logfile FILE
- Overrides
LOG_FILE
--loglevel/-L LEVEL
- Overrides
LOG_LEVEL
--nolog
- Sets
LOG_ENABLED
toFalse
也可以看看
- Module logging.handlers
- 有关可用处理程序的更多文档
Custom Log Formats¶
通过扩展LogFormatter
类并将LOG_FORMATTER
指向您的新类,可以为不同的操作设置自定义日志格式.
-
class
scrapy.logformatter.
LogFormatter
¶ 用于为不同操作生成日志消息的类.
所有方法都必须返回一个字典,其中列出了参数
level
,msg
和args
,这些args
将在调用logging.log
时用于构造日志消息.方法输出的字典键:
level
是该操作的日志级别,您可以使用python日志记录库中的日志级别:logging.DEBUG
,logging.INFO
,logging.WARNING
,logging.ERROR
和logging.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: 该功能可以:
- 通过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 .