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:

  • Führen Sie Unterprozeß aus und drucken Sie die Ausgabe an die Protokollierung
  • Wie kann ich die Protokollierung bei laufenden Unit-Tests in Python Django deaktivieren?
  • Wie man Keras Verlust Ausgabe in eine Datei protokolliert
  • Django Setup Default Logging
  • Python und / oder Django-Lösung zum Lesen von Log-Dateien auf Linux?
  • Django-Logs: jedes Tutorial, um eine Datei zu protokollieren
  •  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"

  • Duplikate einer Liste von Sätzen entfernen
  • Was ist der Algorithmus von 'set.intersection ()' in Python?
  • Zusammenführen von Sätzen, die sogar ein Element gemeinsam haben
  • Leistungsvergleich: insert vs build Python set operations
  • Machen Sie Streuung von Satz von Punkten in Tupeln
  • Wie kann Python dict mehrere Schlüssel mit demselben Hash haben?
  • 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.