首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scrapy框架- Colorize日志记录

Scrapy框架- Colorize日志记录
EN

Stack Overflow用户
提问于 2017-02-08 00:34:33
回答 1查看 994关注 0票数 4

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

我的问题是我不能让它在Scrapy中正常工作。我本以为爬行器中的记录器对象会有一个处理程序,然后我会切换该处理程序的格式化程序。当我查看spider.logger.logger内部的内容时,我发现handler是一个空列表。我尝试在一个新的流处理程序中添加我的格式化程序。

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

这样做的效果是让scrappy输出每条消息两次。第一条消息是彩色的,但没有Scrapy格式。第二个是没有颜色的Scrapy格式。

如何使Scrapy输出的彩色日志保持可以在settings.py中设置的相同格式

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-10 15:47:53

如果您打算只对LogRecord进行着色,则可以使用ANSI转义码在settings.py中自定义LOG_FORMAT

示例:

代码语言:javascript
复制
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的顶部

代码语言:javascript
复制
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。这是一个老生常谈的解决方案,可能不是最佳实践,但它确实有效。

实现这一点的一种更合适的方法是覆盖logging.StreamHandler。这里有a bunch of discussion on,它可以引导你找到正确的方向。

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

settings.py

代码语言:javascript
复制
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
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42095184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档