Scrapy - вход в файл и стандартный вывод одновременно с именами пауков - PullRequest
17 голосов
/ 16 декабря 2011

Я решил использовать модуль регистрации Python, потому что сообщения, сгенерированные Twisted on std error, слишком длинные, и я хочу INFO выровнять значимые сообщения, такие как сгенерированные StatsCollector, для записи наотдельный файл журнала при сохранении сообщений на экране.

 from twisted.python import log
     import logging
     logging.basicConfig(level=logging.INFO, filemode='w', filename='buyerlog.txt')
     observer = log.PythonLoggingObserver()
     observer.start()

Ну, это нормально, у меня есть мои сообщения, но недостатком является то, что я не знаю, какие сообщения генерируются каким пауком!Это мой файл журнала, в котором "1007" *:

 INFO:twisted:Log opened.
  2 INFO:twisted:Scrapy 0.12.0.2543 started (bot: property)
  3 INFO:twisted:scrapy.telnet.TelnetConsole starting on 6023
  4 INFO:twisted:scrapy.webservice.WebService starting on 6080
  5 INFO:twisted:Spider opened
  6 INFO:twisted:Spider opened
  7 INFO:twisted:Received SIGINT, shutting down gracefully. Send again to force unclean shutdown
  8 INFO:twisted:Closing spider (shutdown)
  9 INFO:twisted:Closing spider (shutdown)
 10 INFO:twisted:Dumping spider stats:
 11 {'downloader/exception_count': 3,
 12  'downloader/exception_type_count/scrapy.exceptions.IgnoreRequest': 3,
 13  'downloader/request_bytes': 9973,

отображается сообщение "витая" по сравнению со стандартными сообщениями, полученными из витой ошибки:

2011-12-16 17:34:56+0800 [expats] DEBUG: number of rules: 4
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2011-12-16 17:34:56+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2011-12-16 17:34:56+0800 [iproperty] INFO: Spider opened
2011-12-16 17:34:56+0800 [iproperty] DEBUG: Redirecting (301) to <GET http://www.iproperty.com.sg/> from <GET http://iproperty.com.sg>
2011-12-16 17:34:57+0800 [iproperty] DEBUG: Crawled (200) <

пробовал% (name) s,% (module) s среди других, но я не могу показать имя паука.Кто-нибудь знает ответ?

РЕДАКТИРОВАТЬ: проблема с использованием LOG_FILE и LOG_LEVEL в настройках заключается в том, что сообщения более низкого уровня не будут отображаться при ошибке STD.

Ответы [ 6 ]

23 голосов
/ 16 декабря 2011

Вы хотите использовать ScrapyFileLogObserver.

import logging
from scrapy.log import ScrapyFileLogObserver

logfile = open('testlog.log', 'w')
log_observer = ScrapyFileLogObserver(logfile, level=logging.DEBUG)
log_observer.start()

Я рад, что вы задали этот вопрос, я давно хотел сделать это сам.

16 голосов
/ 25 февраля 2012

Очень просто перенаправить вывод, используя: scrapy some-scrapy's-args 2>&1 | tee -a logname

Таким образом, все, что scrapy выводит в stdout и stderr, будет перенаправлено в файл лога и также выведено на экран.*

7 голосов
/ 07 декабря 2015

Для всех тех, кто пришел сюда до прочтения текущей документации версии:

import logging
from scrapy.utils.log import configure_logging

configure_logging(install_root_handler=False)
logging.basicConfig(
    filename='log.txt',
    filemode = 'a',
    format='%(levelname)s: %(message)s',
    level=logging.DEBUG
)
5 голосов
/ 09 мая 2013

Я знаю, что это старый, но это был действительно полезный пост, так как класс все еще не документирован должным образом в документах Scrapy.Кроме того, мы можем пропустить импорт журналов и напрямую использовать журналы Scrapy.Спасибо всем!

from scrapy import log

logfile = open('testlog.log', 'a')
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG)
log_observer.start()
1 голос
/ 17 ноября 2018

ScrapyFileLogObserver больше не поддерживается.Вы можете использовать стандартный модуль регистрации Python.

import logging
logging.getLogger().addHandler(logging.StreamHandler())
0 голосов
/ 05 сентября 2018

Как сказал официальный документ Scrapy:

Scrapy использует встроенную систему регистрации Python для регистрации событий.

Таким образом, вы можете настроить свой регистратор как обычный скрипт Python.

Сначала вы должны импортировать модуль регистрации:

import logging

Вы можете добавить эту строку в свой паук:

logging.getLogger().addHandler(logging.StreamHandler())

Это добавляет обработчик потока квойти в консоль.

После этого вам необходимо настроить путь к файлу журнала.

Добавить файл с именем custom_settings, который состоит из настроек, указанных вашим пауком:

custom_settings = {
     'LOG_FILE': 'my_log.log',
     'LOG_LEVEL': 'INFO',
     ... # you can add more settings
 }

Весь класс выглядит так:

import logging

class AbcSpider(scrapy.Spider):
    name: str = 'abc_spider'
    start_urls = ['you_url']
    custom_settings = {
         'LOG_FILE': 'my_log.log',
         'LOG_LEVEL': 'INFO',
         ... # you can add more settings
     }
     logging.getLogger().addHandler(logging.StreamHandler())

     def parse(self, response):
        pass
...