python - pattern - Scrapy Framework-Colorize Protokollierung



python shell framework (1)

Wenn Sie nur LogRecord colorieren LogRecord , können Sie LOG_FORMAT in settings.py mit ANSI-Escape-Codes anpassen.

Beispiel:

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'

Wenn Sie auch verschiedene Protokollebenen mit unterschiedlichen Farben scrapy.utils.log._get_handler möchten, können Sie scrapy.utils.log._get_handler ( Quellcode ) überschreiben.

Platziere das oben in deiner 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

Nach dem Aufruf des ursprünglichen _get_handler setzen Sie den Formatierer zurück und _get_handler dann an scrapy.utils.log . Dies ist eine hacky Lösung und möglicherweise nicht die beste Praxis, aber es funktioniert einfach.

Ein geeigneterer Weg, dies zu erreichen, ist das Überschreiben von logging.StreamHandler . Es gibt eine Reihe von Diskussionen über SO, die Sie in die richtige Richtung führen können.

Hier colorlog ich meine vollständigen colorlog zur Verfügung, die in meinen Projekten verwendet werden (ein colorlog eines colorlog wird verwendet).

settings.py

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

Ich versuche Scrapy colorisierte Protokolle auszugeben. Ich bin mit der Python-Protokollierung nicht so vertraut, aber mein Verständnis ist, dass ich meinen eigenen Formatierer machen und ihn durch Scrapy benutzen muss. Es gelang mir, einen Formatierer zu erstellen, der die Ausgabe mit Clint kolorierte.

Mein Problem ist, dass ich es in Scrapy nicht richtig machen kann. Ich hätte erwartet, dass das Logger-Objekt in meiner Spinne einen Handler hätte, dann hätte ich den Formatierer dieses Handlers gewechselt. Wenn ich spider.logger.logger , was in spider.logger.logger , sehe ich, dass der handler eine leere Liste ist. Ich habe versucht, meinen Formatierer in einem neuen Stream-Handler hinzuzufügen.

crawler.spider.logger.logger.addHandler(sh) wobei sh ein Handler ist, der meinen Farbformatierer benutzt.

Dies fügt für den Effekt hinzu, um scrappy Ausgabe jeder Nachrichten zweimal zu machen. Die erste Nachricht ist farbig, hat aber keine Scrapy-Formatierung. Die zweite hat Scrapy-Formatierung ohne Farben.

Wie kann ich Scrapy farbige Protokolle ausgeben lassen, die dasselbe Format haben, das in settings.py eingestellt werden kann settings.py

Vielen Dank





scrapy