Доступ к количеству журналов во время работы в scrapinghub

У меня есть небольшое расширение scrapy, которое просматривает объект статистики сканера и отправляет мне электронное письмо, если сканер выдал сообщения журнала определенного типа (например, ПРЕДУПРЕЖДЕНИЕ, КРИТИЧЕСКОЕ, ОШИБКА).

Эта статистика доступна через объект статистики пауков (crawler.stats.get_stats()), например:

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

Если я запускаю паука на scrapinghub, статистики журнала там нет. Есть много других тонкостей (например, количество исключений и т. д.), но количество журналов отсутствует. Кто-нибудь знает, как их туда достать или как получить к ним доступ на скрейпинг-хабе?

Я также проверил значения «Dumping Scrapy stats» после закрытия паука. Если я запускаю его на своей машине, количество журналов есть, если я запускаю его на очистке, количество журналов отсутствует.


person tony994    schedule 02.12.2014    source источник
comment
Изменится ли это, если вы установите LOG_LEVEL в DEBUG в настройках Scrapy?   -  person bosnjak    schedule 03.12.2014
comment
нет, я пробовал все уровни журнала. журналы отображаются в веб-интерфейсе scrapinghub, но не в объекте статистики.   -  person tony994    schedule 03.12.2014
comment
Разве вы не имеете в виду crawler.stats.get_stats() вместо spider.stats.get_stats()?   -  person bosnjak    schedule 03.12.2014
comment
ага, извините за ошибку. я имею в виду Crawler.stats. Я исправил это в вопросе   -  person tony994    schedule 03.12.2014


Ответы (2)



Это также может помочь кому-то еще. Я написал небольшой плагин для сбора статистики журнала и сохранения ее в статистике с собственным префиксом.

чтобы активировать его, сохраните его в файл (например, loggerstats.py) и активируйте его как расширение в настройках вашего сканера settings.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
person tony994    schedule 08.12.2014