• 0

كيف أُلوّن مخرجات أخطاء بايثون؟

أُلاحظ عند استخدام تطبيق Mono أن مخرجات الأخطاء تكون ملونة فمثلا رسائل التنقيح باللون الأصفر والأخطاء بالأحمر وهكذا..

فهل يمكن تلوين مخرجات وحدة logging في بايثون كما في Mono؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

لديك خيارين لتلوين ناتج سجلات بايثون، فإما أن تقوم باستخدام مكتبة للتلوين أو أن تقوم بكتابة شيفرات التلوين بنفسك.
يمكنك على سبيل المثال استخدام مكتبة colorlog التي يمكن تثبيتها عن طريق PyPI، وهذا مثال على استخدام هذه المكتبة لتلوين ناتج السجلات التنقيح:

import logging
LOG_LEVEL = logging.DEBUG
LOGFORMAT = "  %(log_color)s%(levelname)-8s%(reset)s | %(log_color)s%(message)s%(reset)s"
from colorlog import ColoredFormatter
logging.root.setLevel(LOG_LEVEL)
formatter = ColoredFormatter(LOGFORMAT)
stream = logging.StreamHandler()
stream.setLevel(LOG_LEVEL)
stream.setFormatter(formatter)
log = logging.getLogger('pythonConfig')
log.setLevel(LOG_LEVEL)
log.addHandler(stream)

log.debug("A quirky message only developers care about")
log.info("Curious users might want to know this")
log.warn("Something is wrong and any user should be informed")
log.error("Serious stuff, this is red for a reason")
log.critical("OH NO everything is on fire")

سيكون الناتج كالتالي:
colorlogs.thumb.png.34c6a16dacd77a3aa17e
وهنالك مكتبات أخرى لتلوين الناتج مثل مكتبة coloredlogs ...إلخ
أما لو أردت استخدام شيفرات برمجية لتلوين ناتج عمليات التنقيح في بايثون فيمكنك كتابة شيفرة برمجية كهذه:

BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)

#The background is set with 40 plus the number of the color, and the foreground with 30

#These are the sequences need to get colored ouput
RESET_SEQ = "\033[0m"
COLOR_SEQ = "\033[1;%dm"
BOLD_SEQ = "\033[1m"

def formatter_message(message, use_color = True):
    if use_color:
        message = message.replace("$RESET", RESET_SEQ).replace("$BOLD", BOLD_SEQ)
    else:
        message = message.replace("$RESET", "").replace("$BOLD", "")
    return message

COLORS = {
    'WARNING': YELLOW,
    'INFO': WHITE,
    'DEBUG': BLUE,
    'CRITICAL': YELLOW,
    'ERROR': RED
}

class ColoredFormatter(logging.Formatter):
    def __init__(self, msg, use_color = True):
        logging.Formatter.__init__(self, msg)
        self.use_color = use_color

    def format(self, record):
        levelname = record.levelname
        if self.use_color and levelname in COLORS:
            levelname_color = COLOR_SEQ % (30 + COLORS[levelname]) + levelname + RESET_SEQ
            record.levelname = levelname_color
        return logging.Formatter.format(self, record)

ولاستخدامها يجب عليك إنشاء صنف خاص بك للسجلات:

# Custom logger class with multiple destinations
class ColoredLogger(logging.Logger):
    FORMAT = "[$BOLD%(name)-20s$RESET][%(levelname)-18s]  %(message)s ($BOLD%(filename)s$RESET:%(lineno)d)"
    COLOR_FORMAT = formatter_message(FORMAT, True)
    def __init__(self, name):
        logging.Logger.__init__(self, name, logging.DEBUG)                

        color_formatter = ColoredFormatter(self.COLOR_FORMAT)

        console = logging.StreamHandler()
        console.setFormatter(color_formatter)

        self.addHandler(console)
        return


logging.setLoggerClass(ColoredLogger)

المصدر

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن