如何在scrapy中使用spider的名称指定日志文件名?

时间:2016-08-08 02:33:28

标签: python scrapy

我正在使用scrapy,在我的scrapy项目中,我创建了几个spider类,正如官方文档所说,我用这种方式指定日志文件名:

 def logging_to_file(file_name):
"""
@rtype: logging
@type file_name:str
@param file_name:
@return:
"""
import logging
from scrapy.utils.log import configure_logging
configure_logging(install_root_handler=False)
logging.basicConfig(
    filename=filename+'.txt',
    filemode='a',
    format='%(levelname)s: %(message)s',
    level=logging.DEBUG,

)
 Class Spider_One(scrapy.Spider):
      name='xxx1'
      logging_to_file(name)
  ......
 Class Spider_Two(scrapy.Spider):
      name='xxx2'
      logging_to_file(name)
  ......

现在,如果我开始Spider_One,一切都是正确的!但是,如果我开始Spider TwoSpider Two的日志文件也会以Spider One的名称命名}!
我从谷歌和stackoverflow搜索了很多答案,但遗憾的是,没有一个工作! 我正在使用python 2.7& scrapy 1.1!
希望有人能帮助我!

1 个答案:

答案 0 :(得分:1)

这是因为每次加载包裹时都会启动logging_to_file。您在这里使用的是一个类变量,您应该使用实例变量。

当你的包或模块加载python时,会加载每个类等等。

class MyClass:
    # everything you do here is loaded everytime when package is loaded
    name = 'something'

    def __init__(self):
        # everything you do here is loaded ONLY when the object is created
        # using this class

要解决您的问题,只需将logging_to_file函数调用移至您的蜘蛛__init__()方法。

class MyClass(Spider):
    name = 'xx1'

    def __init__(self):
        super(MyClass, self).__init__()
        logging_to_file(self.name)