Protokollierung auf spezifische Fehlerprotokolldatei in scrapy

Ich laufe ein Protokoll von scrapy, indem ich dies tue:

from scrapy import log class MySpider(BaseSpider): name = "myspider" def __init__(self, name=None, **kwargs): LOG_FILE = "logs/spider.log" log.log.defaultObserver = log.log.DefaultObserver() log.log.defaultObserver.start() log.started = False log.start(LOG_FILE, loglevel=log.INFO) super(MySpider, self).__init__(name, **kwargs) def parse(self,response): .... raise Exception("Something went wrong!") log.msg('Something went wrong!', log.ERROR) # Somehow write to a separate error log here. 

Dann laufe ich die Spinne wie folgt:

 scrapy crawl myspider 

Dies würde alle log.INFO Daten sowie log.ERROR in spider.log .

Wenn ein Fehler auftritt, möchte ich auch diese Details in einer separaten Protokolldatei namens spider_errors.log . Es wäre einfacher, nach Fehlern zu suchen, die aufgetreten sind, anstatt zu versuchen, durch die gesamte spider.log Datei zu scannen (was riesig sein könnte).

Gibt es einen Weg, dies zu tun?

BEARBEITEN:

Versuche mit PythonLoggingObserver:

 def __init__(self, name=None, **kwargs): LOG_FILE = 'logs/spider.log' ERR_File = 'logs/spider_error.log' observer = log.log.PythonLoggingObserver() observer.start() log.started = False log.start(LOG_FILE, loglevel=log.INFO) log.start(ERR_FILE, loglevel=log.ERROR) 

Aber ich bekomme ERROR: No handlers could be found for logger "twisted"

  • Wie bekomme ich die Anhänger einer Person sowie Kommentare unter den Fotos in Instagram mit scrapy?
  • Wie kratze ich eine Website, die Login mit Python und Schüsselsuppe erfordert?
  • Umgang mit Paginierung in lxml
  • Parsing JS mit schöner Suppe
  • Python-Daten kratzen mit Scrapy
  • Wie bekomme ich numerische Daten beim Web-Scraping?
  • Nested For Loop mit ungleichen Entitäten
  • Scrapy Shell und Scrapy Splash
  • One Solution collect form web for “Protokollierung auf spezifische Fehlerprotokolldatei in scrapy”

    Lass die Logging die Arbeit machen. Versuchen Sie, PythonLoggingObserver anstelle von DefaultObserver :

    • Konfiguriere zwei Logger (eine für INFO und eine für ERROR Meldungen) direkt in python oder via fileconfig oder über dictconfig (siehe docs )
    • Starten Sie es in Spinne __init__ :

       def __init__(self, name=None, **kwargs): # TODO: configure logging: eg logging.config.fileConfig("logging.conf") observer = log.PythonLoggingObserver() observer.start() 

    Lassen Sie mich wissen, wenn Sie Hilfe bei der Konfiguration von Loggern benötigen.

    BEARBEITEN:

    Eine weitere Möglichkeit besteht darin, zwei Datei-Log-Beobachter in __init__.py zu starten:

     from scrapy.log import ScrapyFileLogObserver from scrapy import log class MySpider(BaseSpider): name = "myspider" def __init__(self, name=None, **kwargs): ScrapyFileLogObserver(open("spider.log", 'w'), level=logging.INFO).start() ScrapyFileLogObserver(open("spider_error.log", 'w'), level=logging.ERROR).start() super(MySpider, self).__init__(name, **kwargs) ... 
    Python ist die beste Programmiersprache der Welt.