【问题标题】:Scrapy framework - Colorize loggingScrapy 框架 - 着色日志记录
【发布时间】:2017-06-25 00:17:26
【问题描述】:

我正在尝试让 Scrapy 输出彩色日志。我对 Python 日志记录不是很熟悉,但我的理解是我必须制作自己的 Formatter 并让 Scrapy 使用它。我成功地制作了一个格式化程序来使用 Clint 对输出进行着色。

我的问题是我无法让它在 Scrapy 中正常工作。我本来希望我的蜘蛛中的记录器对象有一个处理程序,然后我会切换该处理程序的格式化程序。当我查看spider.logger.logger 里面的内容时,我发现handler 是一个空列表。我试图将我的格式化程序添加到一个新的流处理程序中。

crawler.spider.logger.logger.addHandler(sh) 其中 sh 是使用我的颜色格式化程序的处理程序。

这有利于使每条消息的scrapy输出两次。第一条消息是彩色的,但没有 Scrapy 格式。第二个是没有颜色的 Scrapy 格式。

如何让 Scrapy 输出彩色日志保持与settings.py 中设置的格式相同

谢谢

【问题讨论】:

    标签: python logging colors scrapy


    【解决方案1】:

    如果您只想为 LogRecord 着色,您可以使用 ANSI 转义码自定义 settings.py 中的 LOG_FORMAT

    例子:

    LOG_FORMAT = '\x1b[0;0;34m%(asctime)s\x1b[0;0m \x1b[0;0;36m[%(name)s]\x1b[0;0m \x1b[0;0;31m%(levelname)s\x1b[0;0m: %(message)s'
    

    如果您还想用不同的颜色为不同的日志级别着色,可以覆盖scrapy.utils.log._get_handler(source code)。

    把它放在你的settings.py顶部附近

    import scrapy.utils.log
    
    _get_handler = copy.copy(scrapy.utils.log._get_handler)
    
    
    def _get_handler_custom(*args, **kwargs):
        handler = _get_handler(*args, **kwargs)
        handler.setFormatter(your_custom_formatter)
        return handler
    
    scrapy.utils.log._get_handler = _get_handler_custom
    

    它的作用是在调用原始_get_handler 后重置格式化程序,然后将其重新附加到scrapy.utils.log。 这是一个 hacky 解决方案,可能不是最佳做法,但它确实有效。

    实现此目的的更合适的方法是覆盖logging.StreamHandler。 SO上有a bunch of discussion可以引导你走向正确的方向。

    在这里,我提供了我在项目中使用的完整工作代码(正在使用第三方包 colorlog)。

    settings.py

    import copy
    
    from colorlog import ColoredFormatter
    import scrapy.utils.log
    
    color_formatter = ColoredFormatter(
        (
            '%(log_color)s%(levelname)-5s%(reset)s '
            '%(yellow)s[%(asctime)s]%(reset)s'
            '%(white)s %(name)s %(funcName)s %(bold_purple)s:%(lineno)d%(reset)s '
            '%(log_color)s%(message)s%(reset)s'
        ),
        datefmt='%y-%m-%d %H:%M:%S',
        log_colors={
            'DEBUG': 'blue',
            'INFO': 'bold_cyan',
            'WARNING': 'red',
            'ERROR': 'bg_bold_red',
            'CRITICAL': 'red,bg_white',
        }
    )
    
    _get_handler = copy.copy(scrapy.utils.log._get_handler)
    
    def _get_handler_custom(*args, **kwargs):
        handler = _get_handler(*args, **kwargs)
        handler.setFormatter(color_formatter)
        return handler
    
    scrapy.utils.log._get_handler = _get_handler_custom
    

    【讨论】:

    • 我知道我们不应该说谢谢,但是谢谢!很好的答案:D
    • 这太好了,我刚刚将它编码到我的项目中,老实说,它似乎应该默认附带 Scrapy,也许 github 上的拉取请求/scrapy 贡献是为了?
    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    相关资源
    最近更新 更多