2011-12-16 11 views
16

He decidido utilizar el módulo de registro de Python porque los mensajes generados por Twisted on std error son demasiado largos, y quiero INFO mensajes significativos de nivel como los generados por el StatsCollector que se escribirá en un archivo de registro separado mientras se mantienen los mensajes en pantalla.Scrapy: iniciando sesión en archivo y stdout simultáneamente, con nombres de araña

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

Bueno, esto está muy bien, tengo mis mensajes, pero el inconveniente es que no sé los mensajes son generados por el cual la araña! Este es mi archivo de registro, con "trenzado" se visualiza por %(name)s:

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, 

En comparación con los mensajes generados a partir de encuadernación en el error estándar:

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

He intentado% (name) s ,% (módulo) s entre otros, pero parece que no puedo mostrar el nombre de araña. ¿Alguien sabe la respuesta?

EDIT: el problema con el uso de LOG_FILE y LOG_LEVEL en la configuración es que los mensajes de nivel inferior no se mostrarán en el error estándar.

+0

donde le has puesto el código? setting.py o código spider? –

Respuesta

22

Desea utilizar el ScrapyFileLogObserver.

import logging 
from scrapy.log import ScrapyFileLogObserver 

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

Me alegra que haya hecho esta pregunta, he estado queriendo hacer esto yo mismo.

+0

después de agregar estas líneas en mi settings.py, scrapy no puede encontrar mis arañas. (línea de comando) – goh

+0

Hmm, lo puse en mi módulo araña y funcionó bien ... déjame experimentar. ** Editar: ** ¿qué hay de ponerlo en el archivo '__init__' del módulo de arañas? Eso parece hacer el trabajo. – Acorn

+0

Hmm, ponerlo en el trabajo de las arañas. Es curioso por qué no funciona en settings.py. Además, no pude encontrar este ScrapyFileObserver en ningún lugar de los documentos. ¿Quizás podrías dirigirme al enlace (que no sea github)? – goh

11

Es muy fácil para redirigir la salida usando: scrapy some-scrapy's-args 2>&1 | tee -a logname

De esta manera, todo lo que Scrapy ouputs en stdout y stderr, será redirigido a un archivo de nombre de registro y también, prited a la pantalla.

+0

¡Funcionó a la perfección! Es ideal para el desarrollo, cuando simplemente estamos experimentando con raspadores y el registro es demasiado largo para mantenerlo en la terminal, sin embargo, no queremos codificar por completo el inicio de sesión de Python en arañas. – CloudRide

5

Sé que esto es antiguo, pero fue una publicación muy útil ya que la clase todavía no está documentada correctamente en los documentos de Scrapy. Además, podemos omitir el registro de importación y usar los registros de scrapy directamente. ¡Gracias a todos!

from scrapy import log 

logfile = open('testlog.log', 'a') 
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG) 
log_observer.start() 
7

Para todas aquellas personas que vinieron aquí antes de leer la versión actual documentation:

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 
) 
Cuestiones relacionadas