Python scrapy 0.18的单个日志文件*

Python scrapy 0.18的单个日志文件*,python,scrapy,Python,Scrapy,我已将scrapy升级到0.18.4版,但我发现以前为每个爬行器设置单独日志文件的脚本现在不起作用: #spider/toy_spider.py def __init__(self,name=None,**kwargs): LOG_FILE = "log/production_%s.log" % (self.name) log.log.defaultObserver = log.log.DefaultObserver() log.log.defaultObser

我已将scrapy升级到0.18.4版,但我发现以前为每个爬行器设置单独日志文件的脚本现在不起作用:

 #spider/toy_spider.py
 def __init__(self,name=None,**kwargs):
     LOG_FILE = "log/production_%s.log" % (self.name)
     log.log.defaultObserver = log.log.DefaultObserver()
     log.log.defaultObserver.start()
     log.started = False
     log.start(LOG_FILE)
     super(MySpider, self).__init__(name, **kwargs)
它适用于scrapy 0.14.4,但不适用于0.18.4。当我运行“scrapy crawl toy_spider”时,它似乎处于某种无限循环中,消息如下所示:

2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [PopAppAnnie4Itune] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

我必须手动终止该过程

该错误很可能是由于双重执行了
log.start()
。使用扩展插件连接
spider\u opened
信号,并在那里执行日志设置

比如:

from twisted.python.log import FileLogObserver
from scrapy import signals


class SpiderLog(object):

    @classmethod
    def from_crawler(cls, crawler):
        obj = cls()
        crawler.signals.connect(obj.setup_logfile, signal=signals.spider_opened)
        return obj

    def setup_logfile(self, spider):
        logfile = 'log/production_%s.log' % spider.name
        fl = FileLogObserver(open(logfile, 'w+'))
        fl.start()
如果项目名为
mybot
,则将此代码保存在文件
mybot/extensions.py
中。要启用扩展,请将此行添加到
设置.py

EXTENSIONS = {
    'mybot.extensions.SpiderLog': 100,
}
但是你会在蜘蛛打开后收到消息。如果每个爬行器只使用一个爬虫实例,则可以将日志文件设置为参数:

scrapy crawl myspider --set LOG_FILE=log/production_myspider.log

这样,您将获得所有日志消息,不需要分机。

谢谢您的回复。”--set LOG_FILE='将暂时执行此任务。出于好奇,我如何才能让扩展正常工作?好的,我已经用相关设置更新了答案以启用扩展。