【问题标题】:Set scrapy built-in loggers at different level than user code logger将scrapy内置记录器设置在与用户代码记录器不同的级别
【发布时间】:2018-04-25 18:52:26
【问题描述】:

Scrapy 内置记录器:

  • scrapy.utils.log
  • scrapy.crawler
  • scrapy.middleware
  • scrapy.core.engine
  • scrapy.extensions.logstats
  • scrapy.extensions.telnet
  • scrapy.core.scraper
  • scrapy.statscollectors

非常冗长。

我试图设置与用户蜘蛛日志级别 INFO 不同的日志级别 DEBUG。这样我可以减少“噪音”。

这个辅助函数有时会起作用:

def set_loggers_level(level=logging.DEBUG):    
  loggers = [
     'scrapy.utils.log',
     'scrapy.crawler',
     'scrapy.middleware',
     'scrapy.core.engine',
     'scrapy.extensions.logstats',
     'scrapy.extensions.telnet',
     'scrapy.core.scraper',
     'scrapy.statscollectors'
 ]
 for logger_name in loggers:
    logger = logging.getLogger(logger_name)
    logger.setLevel(level)
    for handler in logger.handlers:
        handler.setLevel(level)

我从 UserSpider init 中调用它:

class UserSpider(scrapy.Spider):

      def __init__(self, *args, **kwargs):
          # customize loggers: Some loggers can't be reset a this point
          helpers.set_loggers_level()
          super(UserSpider, self).__init__(*args, **kwargs)

这种方法有时会奏效,有时则不会。

什么是正确的解决方案?

【问题讨论】:

    标签: python logging scrapy


    【解决方案1】:

    您可以在您的settings.py 中适当地设置LOG_LEVEL,在此处阅读更多信息:https://doc.scrapy.org/en/latest/topics/settings.html#std:setting-LOG_LEVEL

    LOG_LEVEL
    默认值:“调试”
    要记录的最低级别。可用级别为:CRITICAL、ERROR、WARNING、INFO、DEBUG。有关详细信息,请参阅日志记录。

    如果项目范围的设置不够集中,您可以使用custom_settings为每个蜘蛛设置它们:

    class MySpider(scrapy.Spider):
        name = 'myspider'
    
        custom_settings = {
            'LOG_LEVEL': 'INFO',
        }
    

    来源: https://doc.scrapy.org/en/latest/topics/settings.html#settings-per-spider

    【讨论】:

    • 设置中的LOG_LEVEL是一个广泛的scrapy项目。我需要设置信息级别不那么冗长。也许这里需要一些scrapy hack,而不是一个常见的设置
    • 我不确定“wide scrapy project”是什么意思,但如果您需要为单个蜘蛛设置此设置,您可以使用custom_settings 为蜘蛛设置相同事情:例如custom_settings = { 'LOG_LEVEL': 'INFO' }。我已经相应地更新了我的示例。
    • 我知道custom_settings,但我只有一只蜘蛛。我想要的是将所有蜘蛛内置记录器放在 DEBUG 级别,并在 INFO 级别使用 self.logger.info 调用蜘蛛日志。
    • 嗯,我不明白这就是你想要的。将内置记录器放在 INFO 中是否更有意义,从而减少 DEBUG 日志的数量?日志级别是删除低于该级别的所有内容的阈值。将其设置为 DEBUG 让所有日志都通过,这就是您在代码中所做的。
    【解决方案2】:

    为每个日志处理程序设置不同的日志级别不太现实。

    最终,更好的方法是从另一个脚本启动 scrapy cli 工具,并使用解析器过滤日志输出。

    【讨论】:

      【解决方案3】:

      我偶然发现了同样的问题。我尝试了各种方法,但看起来因为 Scrapy 使用日志记录模块,你必须将它设置在全局级别,这会导致 Scrapy 打印所有调试信息。

      我找到了更可靠的解决方案,可以在 DEBUG 中将 bool 标志与 print 语句一起使用,并将记录器用于 INFO、ERROR 和 WARNING。

      【讨论】:

        猜你喜欢
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        • 2011-03-16
        • 2014-08-21
        • 2015-12-02
        相关资源
        最近更新 更多