Django записывает цвета в зависимости от уровня ошибки, без модуля - PullRequest
2 голосов
/ 24 сентября 2019

Я использую стандарт Django logging , основанный на встроенном модуле регистрации Python.Моя конфигурация регистрации в settings.py близка к следующему:

import logging

logger = logging.getLogger(__name__)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '\x1b[33;21m{levelname} {asctime} {module} {process:d} {thread:d}\x1b[0m: {message}',
            'style': '{',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'sentry': {
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
            'tags': {'custom-tag': 'x'},
        },
    },
    'loggers': {
        '': {
            'handlers': ['console', 'sentry'],
            'level': 'DEBUG' if DEBUG else 'WARNING',
            'propagate': True,
        },
    },
}

Я хотел бы знать, возможно ли иметь цвет ANSI (в данном примере \x1b[33;21m) в зависимости от levelname вформат, без установки дополнительных модулей, таких как colorlog.

1 Ответ

1 голос
/ 24 сентября 2019

Это можно сделать, создав подкласс logging.Formatter и изменив формат в соответствии с уровнем, посмотрев на объект LogRecord.Следующий код регистрирует ОШИБКИ красным, а все остальное - зеленым.Это просто очень простой пример, чтобы дать вам представление о том, как это может работать.

import logging

class LevelFormatter(logging.Formatter):

    def _set_format(self, fmt, style='%'):
         self._style = logging._STYLES[style][0](fmt)
         self._fmt = self._style._fmt

    def format(self, record):
        if record.levelno == logging.ERROR:
            self._set_format('\x1b[31;21m %(levelname)s \x1b[0m - %(message)s')
        else:
            self._set_format('\x1b[32;21m %(levelname)s \x1b[0m - %(message)s')
        return super().format(record)

fmt = LevelFormatter()

logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(fmt)
logger.addHandler(handler)

logger.error('error') # appears in red
logger.warning('warn') # appears in green
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...