python स्क्रैप फ्रेमवर्क-लॉग इन करना रंगीन करें



logging colors (1)

मैं Scrapy आउटपुट रंगीन लॉग बनाने की कोशिश कर रहा हूं I मैं पायथन लॉगिंग से बहुत परिचित नहीं हूं, लेकिन मेरी समझ यह है कि मुझे अपना फॉर्मेट बनाना चाहिए और इसे स्कैपी द्वारा उपयोग करना चाहिए। क्लिंट का उपयोग करके आउटपुट को रंगाई करने के लिए मैं फॉर्मेट बनाने में सफल रहा

मेरी समस्या यह है कि मैं इसे सही ढंग से स्क्रैप के भीतर काम नहीं कर सकता मैं अपने मकड़ी में एक हेन्डलर के लिए लॉगर ऑब्जेक्ट की उम्मीद करूँगा, फिर मैंने उस हैंडलर के फॉर्मेटर को बदल दिया होता। जब मुझे लगता है कि spider.logger.logger अंदर क्या spider.logger.logger , मुझे लगता है कि handler एक खाली सूची है। मैंने एक नया स्ट्रीम हैंडलर में अपना फॉर्मेटर जोड़ने का प्रयास किया

crawler.spider.logger.logger.addHandler(sh) जहां sh मेरे रंग फ़ॉर्मेटर का उपयोग कर एक हेन्डलर है crawler.spider.logger.logger.addHandler(sh)

यह दो बार दो बार संदेशों को निर्बाध आउटपुट बनाने के लिए प्रभाव डालता है पहला संदेश रंगीन है लेकिन इसमें स्क्राइक फ़ॉर्मेटिंग नहीं है। दूसरे के पास स्क्राइक फ़ॉर्मेटिंग नहीं रंगों के साथ है।

मैं कैसे Scrappy आउटपुट रंगीन लॉग्स को उसी स्वरूप में रख सकता हूं जिसे settings.py में सेट किया जा सकता है

धन्यवाद


यदि आप केवल LogRecord को LogRecord चाहते हैं, तो आप LOG_FORMAT कोड के साथ settings.py में LOG_FORMAT को कस्टमाइज़ कर सकते हैं।

उदाहरण:

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 ( स्रोत कोड ) को ओवरराइड कर सकते हैं।

इसे अपने 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 पुनः scrapy.utils.log । यह एक हैकिंग समाधान है और यह सर्वोत्तम अभ्यास नहीं हो सकता, लेकिन यह सिर्फ काम करता है।

इसे हासिल करने का एक अधिक उचित तरीका logging.StreamHandler को ओवरराइड करना है। logging.StreamHandler वहां पर चर्चा का एक गुच्छा है जो आपको सही दिशा में ले जा सकता है।

यहां मैं अपने प्रोजेक्ट्स (एक तीसरे पक्ष के पैकेज वाले colorlog का उपयोग में है) में अपना पूरा काम कोड प्रदान colorlog है

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




scrapy