用哨兵处理scrapy中的所有异常

问题描述 投票:3回答:1

我正在研究一个带scrapy的项目一段时间了,我想整合哨兵,

我使用过scrapy-sentry,但它根本不起作用

我也尝试使用Extensions实现它,但只有在spider的回调中发生错误(而不是pipelines.py,items.py)时它才有用...

from scrapy import signals

from raven import Client


class FailLogger(object):
    client = Client(settings.get('SENTRY_DSN'))

    @classmethod
    def from_crawler(cls, crawler):
        ext = cls()

        crawler.signals.connect(ext.spider_error, signal=signals.spider_error)
        return ext

    def spider_error(self, failure, response, spider):
        try:
            failure.raiseException()
        except:
            self.client.get_ident(self.client.captureException())

有没有我可以记录错误(蜘蛛,物品,管道......)到哨兵,像在Django?

谢谢。

python exception scrapy sentry
1个回答
4
投票

这是一个老帖子,但我的回答可能对其他人有用。 Raven被sentry-python取代(在pip中命名为sentry-sdk)。使用这个新的包,有一个比scrapy-sentry更简单和完整的解决方案。它基于scrapy日志记录功能基于stdlib日志记录模块的事实。

您可以使用以下非常简单的scrapy扩展来捕获蜘蛛内外的异常和错误(包括下载中间件,项目中间件等)。

  1. 添加到scrapy项目的extensions.py文件中SentryLogging扩展:
import sentry_sdk
from scrapy.exceptions import NotConfigured

class SentryLogging(object):
    """
    Send exceptions and errors to Sentry.
    """

    @classmethod
    def from_crawler(cls, crawler):
        sentry_dsn = crawler.settings.get('SENTRY_DSN', None)
        if sentry_dsn is None:
            raise NotConfigured
        # instantiate the extension object
        ext = cls()
        # instantiate
        sentry_sdk.init(sentry_dsn)
        # return the extension object
        return ext
  1. 将以下行添加到settings.py以使用低值激活它以尽快捕获异常和错误:
# Enable or disable extensions
# See https://doc.scrapy.org/en/latest/topics/extensions.html
EXTENSIONS = {
    'myproject.extensions.SentryLogging': -1, # Load SentryLogging extension before others
}

# Send exceptions to Sentry
# replace SENTRY_DSN by you own DSN
SENTRY_DSN = "XXXXXXXXXX"

确保通过相关项目的Sentry DSN替换SENTRY_DSN

蜘蛛内外的错误和异常现在应该发送给Sentry。如果您想进一步自定义发送给Sentry的内容,您可能需要根据sentry_sdk.init()编辑对its documentation的调用。

© www.soinside.com 2019 - 2024. All rights reserved.