4

我一直在做一个Scrapy项目,到目前为止一切都很好。但是,我对 Scrapy 的日志记录配置可能性并不满意。目前,我已经设置LOG_FILE = 'my_spider.log'settings.py我的项目。当我scrapy crawl my_spider在命令行上执行时,它会为整个爬取过程创建一个大日志文件。这对我的目的来说是不可行的。

如何将 Python 的自定义日志处理程序与scrapy.log模块结合使用?特别是,我想利用 Python logging.handlers.RotatingFileHandler,这样我就可以将日志数据分成几个小文件,而不必处理一个大文件。不幸的是,Scrapy 的日志记录工具的文档不是很丰富。提前谢谢了!

4

3 回答 3

5

您可以通过首先在 scrapy.utils.log.configure_logging 中禁用 root 句柄然后添加您自己的日志处理程序来将所有 scrapy 日志记录到文件中。

在scrapy项目的settings.py文件中添加如下代码:

import logging
from logging.handlers import RotatingFileHandler

from scrapy.utils.log import configure_logging

LOG_ENABLED = False
# Disable default Scrapy log settings.
configure_logging(install_root_handler=False)

# Define your logging settings.
log_file = '/tmp/logs/CRAWLER_logs.log'

root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rotating_file_log = RotatingFileHandler(log_file, maxBytes=10485760, backupCount=1)
rotating_file_log.setLevel(logging.DEBUG)
rotating_file_log.setFormatter(formatter)
root_logger.addHandler(rotating_file_log)

我们还根据需要自定义日志级别(DEBUG 到 INFO)和格式化程序。要在你的蜘蛛、管道中添加自定义日志,我们可以像普通的 python 日志一样轻松地做到这一点,如下所示:

内部管道.py

import logging
logger = logging.getLogger()
logger.info('processing item')

希望这可以帮助!

于 2018-06-21T13:34:15.780 回答
2

您可以像这样集成自定义日志文件(我不确定如何集成旋转器):

在您的蜘蛛类文件中:

from datetime import datetime
from scrapy import log
from scrapy.spider import BaseSpider

class ExampleSpider(BaseSpider):
    name = "example"
    allowed_domains = ["example.com"]
    start_urls = ["http://www.example.com/"]

    def __init__(self, name=None, **kwargs):
        LOG_FILE = "scrapy_%s_%s.log" % (self.name, datetime.now())
        # remove the current log
        # log.log.removeObserver(log.log.theLogPublisher.observers[0])
        # re-create the default Twisted observer which Scrapy checks
        log.log.defaultObserver = log.log.DefaultObserver()
        # start the default observer so it can be stopped
        log.log.defaultObserver.start()
        # trick Scrapy into thinking logging has not started
        log.started = False
        # start the new log file observer
        log.start(LOG_FILE)
        # continue with the normal spider init
        super(ExampleSpider, self).__init__(name, **kwargs)

    def parse(self, response):
        ...

输出文件可能如下所示:

scrapy_example_2012-08-25 12:34:48.823896.log

于 2012-08-25T18:18:49.880 回答
2

Scrapy 使用标准的 python 记录器,这意味着您可以在创建蜘蛛时抓取和修改它们。

import scrapy
import logging
from logging.handlers import RotatingFileHandler


Class SpiderSpider(scrapy.Spider):
    name = 'spider'
    start_urls = ['https://en.wikipedia.org/wiki/Spider']

    handler = RotatingFileHandler('spider.log', maxBytes=1024, backupCount=3)
    logging.getLogger().addHandler(handler)

    def parse(self, response):
        ...
于 2016-05-20T20:42:41.300 回答