python - Scrapy 框架 - 为日志记录着色

标签 python logging colors scrapy

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

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

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

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

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

谢谢

最佳答案

如果你想着色 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'

如果你还想用不同的颜色给不同的日志级别着色,你可以覆盖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。有 a bunch of discussion在 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

关于python - Scrapy 框架 - 为日志记录着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42095184/

相关文章:

python - 如何将多个 XLSX 文件合并到一个工作簿中,同时保持其工作表独立?

c++ - 如何在 C++ 中处理 "exit current function, if error on current statement"

python - 如何使用颜色图为 Pandas DataFrames 的绘图着色

logging - 为什么我们在 Logback/SLF4J 中使用 MDC.remove() ?

css - 如何计算 CSS 渐变路径?

CSS Opacity 不生成颜色叠加层?

python - 为什么我不能继承 datetime.date?

java - 如何在 Java 中制作元组列表

python - 每个特定方法的 Django OAuth 工具包范围

mysql - 如何在 Google Cloud SQL 中跟踪 mysql 日志?