在scrapinghub中运行时scrapy访问日志计数

时间:2014-12-02 21:09:52

标签: python scrapy scrapinghub

我有一个小的scrapy扩展,它查看爬虫的stats对象,如果爬虫抛出了某种类型的日志消息(例如WARNING,CRITICAL,ERROR),则会向我发送一封电子邮件。

蜘蛛属统计对象(crawler.stats.get_stats())可以访问这些统计数据,例如:

crawler.stats.get_stats().items()
 [..]
 'log_count/DEBUG': 9,
 'log_count/ERROR': 2,
 'log_count/INFO': 4,
 [..]

如果我在scrapinghub上运行蜘蛛,则日志统计数据不存在。还有很多其他的东西(例如异常计数等)但缺少日志计数。有人知道如何将它们放在那里或如何在刮擦集线器上访问它们吗?

我还检查了"倾倒Scrapy统计数据"蜘蛛关闭后的值。如果我在我的机器上运行它,那么日志计数就在那里,如果我在scrapinghub上运行它,则缺少日志计数。

2 个答案:

答案 0 :(得分:1)

这里的问题是scrapy在log observer中填充了这些统计数据;但是Scrapinghub没有使用默认的日志观察器。可能在他们的论坛上报告这个是最好的,你也可以在上面链接这个问题。

答案 1 :(得分:0)

这也可能有助于其他人。我写了一个小插件来收集日志统计信息并将它们保存在带有自己前缀的统计信息字典中。

激活它,将其保存到文件(例如loggerstats.py)并将其激活为爬虫设置中的扩展名.py:

EXTENSIONS = {
    'loggerstats.LoggerStats': 10,
}

脚本:

from scrapy import log
from scrapy.log import level_names
from twisted.python import log as txlog


class LoggerStats(object):

    def __init__(self, crawler, prefix='stats_', level=log.INFO):
        self.level = level
        self.crawler = crawler
        self.prefix = prefix
        txlog.startLoggingWithObserver(self.emit, setStdout=False)

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler)
        return o

    def emit(self, ev):
        level = ev.get('logLevel')
        if level >= self.level:
            sname = '%slog_count/%s' % (self.prefix, level_names.get(level, level))
            self.crawler.stats.inc_value(sname)

然后它会计算日志并在爬虫统计数据中维护计数。例如:

stats_log_count/INFO: 10
stats_log_count/WARNING: 1
stats_log_count/CRITICAL: 5