Scrapy - l'enregistrement du dossier et la sortie standard (stdout) simultanément, avec les noms

j'ai décidé d'utiliser le module de journalisation Python car les messages générés par Twisted sur l'erreur std sont trop longs, et je veux INFO nivelez les messages significatifs tels que ceux générés par le StatsCollector à écrire sur un fichier journal séparé tout en maintenant les messages à l'écran.

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

eh Bien, c'est bien, j'ai de mes messages, mais l'inconvénient est que je ne connais pas les messages sont générés par lequel araignée! C'est mon fichier journal, avec" twisted " affiché par %(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,

par rapport aux messages générés par twisted sur 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) <

j'ai essayé %(nom)s, %(module) s entre autres mais je ne semble pas être capable de montrer le nom de l'Araignée. Personne ne connaît la réponse?

modifier: le problème avec l'aide de LOG_FILE et LOG_LEVEL dans les paramètres est que les messages de niveau inférieur ne seront pas affichés sur l'erreur std.

16
demandé sur Acorn 2011-12-16 13:37:41

5 réponses

vous voulez utiliser le ScrapyFileLogObserver.

import logging
from scrapy.log import ScrapyFileLogObserver

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

je suis content que vous ayez posé cette question, je voulais le faire moi-même.

22
répondu Acorn 2011-12-16 10:26:52

il est très facile de rediriger la sortie en utilisant: scrapy some-scrapy's-args 2>&1 | tee -a logname

de cette façon, tout ce que scrapy ouputs dans stdout et stderr, sera redirigé vers un fichier logname et aussi, prited à l'écran.

12
répondu Alexander Artemenko 2012-02-25 17:55:42

pour tous ceux qui sont venus ici avant de lire le courant documentation version:

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
)
7
répondu Alex K. 2015-12-07 13:09:10

je sais que c'est vieux, mais il était vraiment utile de post depuis la classe n'est toujours pas correctement documentées dans le Scrapy docs. En outre, nous pouvons passer l'importation de la coupe et utiliser des rondins raclés directement. Merci À Tous!

from scrapy import log

logfile = open('testlog.log', 'a')
log_observer = log.ScrapyFileLogObserver(logfile, level=log.DEBUG)
log_observer.start()
5
répondu IamnotBatman 2013-05-08 20:45:01

Comme Scrapy Officiel Doc dit:

Scrapy utilise le système de journalisation intégré de Python pour la journalisation d'événements.

ainsi vous pouvez configurer votre logger comme un script Python normal.

Vous pouvez ajouter cette ligne à votre araignée:

logging.getLogger().addHandler(logging.StreamHandler())

il ajoute un gestionnaire de flux pour se connecter à la console.

après cela, vous devez configurer le chemin du fichier de journalisation.

Ajouter un dict nommé custom_settings qui se compose de votre spider-spécifié paramètres:

custom_settings = {
     'LOG_FILE': 'my_log.log',
     'LOG_LEVEL': 'INFO',
     ... # you can add more settings
 }

toute la classe ressemble à:

class AbcSpider(scrapy.Spider):
    name: str = 'abc_spider'
    start_urls = ['you_url']
    custom_settings = {
         'LOG_FILE': 'my_log.log',
         'LOG_LEVEL': 'INFO',
         ... # you can add more settings
     }
     logging.getLogger().addHandler(logging.StreamHandler())

     def parse(self, response):
        pass
0
répondu Andrew Shi 2018-09-05 09:12:21