2016-08-08 5 views
0

私はscrapyを使用しています、私のscrapyプロジェクトでは、私は、いくつかのクモのクラスを作成した私は、ログファイル名を指定するには、この方法を使用:今すぐスパイダーの名前でログファイル名を指定する方法は?公式文書が言ったように

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 Twoを起動すると、Spider Twoのログファイルの名前はSpider Oneとなります!
Googleとstackoverflowから多くの回答を検索しましたが、残念ながら誰も働いていませんでした。
私はPython 2.7 &の治療法1.1を使用しています!
誰でも私を助けることを願っています!

答えて

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

昨日、各スパイダーの '__init__'メソッドに' logging_to_file'関数を移動しようとしましたが、そうした場合、ログファイルは作成されません。 – nick

+0

@nickあなたはどのようにあなたのクモを実行していますか? 'scrapy crawl spider_name'で実行している場合には、他のスパイダーの' logging_to_file'に到達する方法はありません – Granitosaurus

+0

はい、私は本当に 'spider_crawl spider_name'コマンドを使って自分のスパイダーを実行しています!! @ Granitosaurus – nick