Registro en el archivo de registro de error específico en scrapy

Estoy ejecutando un registro de scrapy haciendo esto:

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. 

Entonces corro la araña así:

 scrapy crawl myspider 

Esto almacenaría todos los datos de log.INFO así como también log.ERROR en spider.log .

Si se produce un error, también me gustaría almacenar esos detalles en un archivo de registro separado llamado spider_errors.log . spider.log búsqueda de errores que ocurrieron en lugar de intentar escanear todo el archivo spider.log (que podría ser enorme).

¿Hay alguna forma de hacer esto?

EDITAR:

Probando con 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) 

Pero me sale ERROR: No handlers could be found for logger "twisted"

Solo deja que el registro haga el trabajo. Intente usar PythonLoggingObserver lugar de DefaultObserver :

  • configure dos registradores (uno para INFO y otro para mensajes de ERROR ) directamente en python, o mediante fileconfig, o mediante dictconfig (ver documentos )
  • iniciarlo en __init__ de araña:

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

Déjame saber si necesitas ayuda con la configuración de registradores.

EDITAR:

Otra opción es iniciar dos observadores de registro de archivos en __init__.py :

 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) ...