2011-12-16 16 views
16

Ho deciso di utilizzare il modulo di registrazione Python perché i messaggi generati da Twisted su std error sono troppo lunghi e voglio i messaggi significativi di livello INFO come quelli generati con lo StatsCollector da scrivere su un file di registro separato mantenendo i messaggi sullo schermo.Scrapy - registrazione su file e stdout simultaneamente, con nomi spider

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

Beh, questo va bene, ho i miei messaggi, ma il lato negativo è che io non conosco i messaggi sono generati da cui ragno! Questo è il mio file di log, con "contorto" essere visualizzato da %(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, 

Rispetto ai messaggi generati dal contorto su standard error:

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

Ho provato% (name) s ,% (modulo) s tra gli altri ma non riesco a mostrare il nome del ragno. Qualcuno conosce la risposta?

EDIT: il problema con l'utilizzo LOG_FILE e LOG_LEVEL nelle impostazioni è che i messaggi di livello inferiore non verranno visualizzati in caso di errore std.

+0

Dove hai messo il tuo codice? setting.py o spider code? –

risposta

22

Si desidera utilizzare ScrapyFileLogObserver.

import logging 
from scrapy.log import ScrapyFileLogObserver 

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

Sono felice che tu abbia fatto questa domanda, volevo farlo da solo.

+0

dopo aver aggiunto queste righe nel mio settings.py, scrapy non riesce a trovare i miei spider. (riga di comando) – goh

+0

Hmm, l'ho messo nel mio modulo spider e ha funzionato bene ... fammi sperimentare. ** Modifica: ** che ne dici di metterlo nel file '__init__' del tuo modulo spider? Sembra fare il lavoro. – Acorn

+0

Hmm, inserendolo negli spider. Divertente perché non funziona in settings.py. Inoltre, non ho potuto trovare questo ScrapyFileObserver ovunque nei documenti. Forse potresti indirizzarmi al link (diverso da github)? – goh

11

E 'molto facile per reindirizzare output utilizzando: scrapy some-scrapy's-args 2>&1 | tee -a logname

In questo modo, tutto ciò che Scrapy delle uscite in stdout e stderr, verrà reindirizzato a un file nomeregistro e anche, prited allo schermo.

+0

ha funzionato perfettamente! È ideale per lo sviluppo, quando stiamo semplicemente sperimentando gli scrapers e il log è troppo lungo per essere conservato nel terminale, ma non vogliamo ancora codificare l'intero python logging in spider. – CloudRide

5

So che questo è vecchio ma si trattava di un post molto utile poiché la classe non è ancora adeguatamente documentata nei documenti Scrapy. Inoltre, possiamo saltare l'importazione della registrazione e utilizzare i registri scrapy direttamente. Ringrazia tutti!

from scrapy import log 

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

Per tutte quelle persone che sono venuti qui prima di leggere la versione attuale 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 
) 
Problemi correlati