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:

  • Lesen Sie aus einer Protokolldatei, wie es mit python geschrieben wird
  • Kann das Protokollierungsformat von Python abhängig von der Meldungsprotokollebene geändert werden?
  • Paramiko Erwartung - Tailing
  • Die Logging.handlers: Wie kann ich nach der Zeit oder maxBytes rollover?
  • Ist python logging jedes log
  • Verwenden Sie Doctest und melden Sie sich im Python-Programm an
  •  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"

  • Python frozenset Hash-Algorithmus / Umsetzung
  • Python: wie man überprüft, ob ein Item zu einem Set hinzugefügt wurde, ohne 2x (Hash, Lookup)
  • Gibt es ein MySQL-Äquivalent zu Pythons Set-Typ?
  • Holen Sie sich einmalige Werte in List of Lists in python
  • Machen Sie Streuung von Satz von Punkten in Tupeln
  • Überschreiben von Set-Methoden in Python
  • 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.