Scrapy框架-着色日志记录

Pie*_*ard 4 python logging colors scrapy

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

我的问题是我无法使其在Scrapy中正常工作。我本来希望我的Spider中的logger对象有一个处理程序,然后我才应该切换该处理程序的格式化程序。当我查看里面的东西时spider.logger.logger,我看到那handler是一个空列表。我试图将格式化程序添加到新的流处理程序中。

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

这增加了效果,使每条消息的草率输出两次。第一条消息是彩色的,但没有Scrapy格式。第二个具有无颜色的Scrapy格式。

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

谢谢

ami*_*mel 6

如果你的意思上色LogRecord而已,你可以自定义LOG_FORMATsettings.py与ANSI转义代码。

例:

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'
Run Code Online (Sandbox Code Playgroud)

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

将此放在您的顶部附近 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
Run Code Online (Sandbox Code Playgroud)

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

实现此目的的更合适方法是覆盖logging.StreamHandler。有一堆讨论对SO这可能会导致你正确的方向。

在这里,我提供了我的项目中使用的全部工作代码(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
Run Code Online (Sandbox Code Playgroud)