【问题标题】:Scrapy: logging to a file without ScrapyFileLogObserver()Scrapy:在没有 ScrapyFileLogObserver() 的情况下记录到文件
【发布时间】:2015-12-25 13:41:41
【问题描述】:

显然,我不应该再使用 ScrapyFileLogObserver (http://doc.scrapy.org/en/1.0/topics/logging.html)。但我仍然希望能够将我的日志消息保存到文件中,并且我仍然希望将所有标准 Scrapy 控制台信息也保存到文件中。

通过阅读如何使用日志记录模块,这是我尝试使用的代码:

class BlahSpider(CrawlSpider):
    name = 'blah'
    allowed_domains = ['blah.com']
    start_urls = ['https://www.blah.com/blahblahblah']

    rules = (
        Rule(SgmlLinkExtractor(allow=r'whatever'), callback='parse_item', follow=True),
    )

    def __init__(self):
        CrawlSpider.__init__(self)
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.DEBUG)
        logging.basicConfig(filename='debug_log.txt', filemode='w', format='%(asctime)s %(levelname)s: %(message)s',
                            level=logging.DEBUG)
        console = logging.StreamHandler()
        console.setLevel(logging.DEBUG)
        simple_format = logging.Formatter('%(levelname)s: %(message)s')
        console.setFormatter(simple_format)
        self.logger.addHandler(console)
        self.logger.info("Something")

    def parse_item(self):
        i = BlahItem()
        return i

它运行良好,并将“某物”保存到文件中。但是,我在命令提示符窗口中看到的所有内容,所有在我使用 ScrapyFileLogObserver 时曾经保存到文件中的内容,现在都没有保存。

我认为我的带有“logging.StreamHandler()”的“控制台”处理程序应该可以处理这个问题,但这只是我读过的内容,我并不真正理解它是如何工作的。

谁能指出我遗漏了什么或哪里出错了?

谢谢。

【问题讨论】:

    标签: python logging scrapy


    【解决方案1】:

    我认为问题在于您同时使用了basicConfigaddHandler

    分别配置两个处理程序:

    self.logger = logging.getLogger()
    self.logger.setLevel(logging.DEBUG)
    
    logFormatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
    
    # file handler
    fileHandler = logging.FileHandler("debug_log.txt")
    fileHandler.setLevel(logging.DEBUG)
    fileHandler.setFormatter(logFormatter)
    self.logger.addHandler(fileHandler)
    
    # console handler
    consoleHandler = logging.StreamHandler()
    consoleHandler.setLevel(logging.DEBUG)
    consoleHandler.setFormatter(logFormatter)
    self.logger.addHandler(consoleHandler)
    

    另见:

    【讨论】:

      【解决方案2】:

      您可以通过首先在 scrapy.utils.log.configure_logging 中禁用根句柄,然后添加您自己的日志处理程序,将所有 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)和格式化程序。 希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        相关资源
        最近更新 更多