example python logging colors scrapy

python - scrapy beautifulsoup example



Marco de Scrapy-Colorize logging (1)

Si solo quiere colorear LogRecord , puede personalizar LOG_FORMAT en settings.py con códigos de escape ANSI.

Ejemplo:

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''

Si también desea colorear diferentes niveles de registro con diferentes colores, puede anular scrapy.utils.log._get_handler ( código fuente ).

Pon esto cerca de la parte superior de tu 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

Lo que hace es reiniciar el formateador después de llamar al _get_handler original, y luego volver a conectarlo a scrapy.utils.log . Esta es una solución hacky y puede que no sea la mejor práctica, pero simplemente funciona.

Una forma más adecuada de lograr esto es anular el logging.StreamHandler . Hay un montón de discusiones sobre SO que pueden guiarlo en la dirección correcta.

Aquí proporciono mis códigos de trabajo completos utilizados en mis proyectos (un colorlog paquete de colorlog está en uso).

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

Estoy intentando hacer que Scrapy imprima registros coloreados. No estoy tan familiarizado con el registro de Python, pero tengo entendido que debo crear mi propio formateador y hacerlo usar Scrapy. Logré hacer un formateador para colorear el resultado usando Clint.

Mi problema es que no puedo hacer que funcione correctamente en Scrapy. Hubiera esperado que el objeto logger en mi araña tuviera un controlador, entonces habría cambiado el formateador de ese controlador. Cuando miro lo que hay dentro de spider.logger.logger , veo que el handler es una lista vacía. Intenté agregar mi formateador en un nuevo controlador de flujo.

crawler.spider.logger.logger.addHandler(sh) donde sh es un controlador que usa mi formateador de color.

Esto agrega efectos para hacer que scrappy genere cada mensaje dos veces. El primer mensaje se colorea pero no tiene formato Scrapy. El segundo tiene formato Scrapy sin colores.

¿Cómo puedo hacer que Scrapy imprima registros coloreados manteniendo el mismo formato que se puede establecer en settings.py

Gracias