为什么scrapy在控制台和外部日志文件中记录不同

时间:2015-08-03 12:50:41

标签: scrapy

我是Scrapy的新手,我曾经设法在Scrapy 0.24上运行我的脚本。但是当我切换到新推出的1.0时,我遇到了一个日志记录问题:我想要做的是将文件和控制台日志级别都设置为INFO,但是我设置了LOG_LEVEL或configure_logging()函数(使用Python)内部日志包而不是scrapy.log),Scrapy始终将 DEBUG 级别信息记录到控制台,它以dict格式返回整个项目对象。实际上,LOG_LEVEL选项仅适用于外部文件。我怀疑它必须与Python日志有关,但不知道如何设置它。任何人都可以帮助我吗?

这是我在run_my_spider.py中配置我的日志记录的方式:

from crawler.settings import LOG_FILE, LOG_FORMAT
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.utils.log import configure_logging
from crawler.spiders.MySpiders import MySpider
import logging


def run_spider(spider):
    settings = get_project_settings()

    # configure file logging
    # It ONLY works for the file
    configure_logging({'LOG_FORMAT': LOG_FORMAT,
                'LOG_ENABLEED' : True,
                'LOG_FILE' : LOG_FILE, 
                'LOG_LEVEL' : 'INFO',
                'LOG_STDOUT' : True})

    # instantiate spider
    process = CrawlerProcess(settings)
    process.crawl(MySpider)
    logging.info('Running Crawler: ' + spider.name)
    process.start() # the script will block here until the spider_closed signal was sent
    logging.info('Crawler ' + spider.name + ' stopped.\n')

......

这是控制台输出:

DEBUG:scrapy.core.engine:Crawled (200) <GET http://mil.news.sina.com.cn/2014-10-09/0450804543.html>(referer: http://rss.sina.com.cn/rollnews/jczs/20141009.js)
 {'item_name': 'item_sina_news_reply',
 'news_id': u'jc:27-1-804530',
 'reply_id': u'jc:27-1-804530:1',
 'reply_lastcrawl': '1438605374.41',
 'reply_table': 'news_reply_20141009'}

非常感谢!

1 个答案:

答案 0 :(得分:1)

您在控制台中查看的内容可能是Twisted Logs。 它会将Debug级别消息打印到控制台。 您可以使用以下方法将它们重定向到日志文件:

from twisted.python import log
observer = log.PythonLoggingObserver(loggerName='logname')
observer.start()

(如How to make Twisted use Python logging?中所述)