Как сделать цвет регистрации в Django/Google App Engine?

Если вы создаете приложение Django/Google App Engine и хотите иметь журналы, которые удобно заметны на основе цвета (т.е. ошибки в красном), как это установить?

Я скопировал полезное решение из этого вопроса, но я не уверен, как его интегрировать в Django/Google App Engine.

Я полагал, что в приложении main.py будет указано следующее: Запуск Django в Google App Engine):

from contrib.utils import ColouredLogger # from the SO question above
logging.setLoggerClass(ColouredLogger)

... где contrib.utils - это то место, где я помещал код Airmind из приведенной выше ссылки в его ответ SO.

Однако это не похоже на вывод на консоль для GAE, который по-прежнему находится в исходном формате + обычный цвет.

Приветствуются предложения и ввод.

Cheers, Brian

Ответы

Ответ 1

Мы используем colorlog, и он делает именно то, что вы ожидаете.

Для потомков используем конфигурацию форматирования:

'color': {
    '()': 'colorlog.ColoredFormatter',
    'format': '%(log_color)s%(levelname)-8s %(message)s',
    'log_colors': {
        'DEBUG':    'bold_black',
        'INFO':     'white',
        'WARNING':  'yellow',
        'ERROR':    'red',
        'CRITICAL': 'bold_red',
    },
}

Ответ 2

Django уже поддерживает вывод цвета через переменную среды DJANGO_COLORS, которая используется, например, при запуске встроенного сервера разработки. Некоторые заметили это и создали решение plug-and-play https://github.com/tiliv/django-colors-formatter; с этим пакетом на пути проекта python мой журнал settings.py выглядит следующим образом:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'formatters': {
        'verbose': {
            '()': 'djangocolors_formatter.DjangoColorsFormatter', # colored output
            'format': '%(levelname)s %(name)s %(asctime)s %(module)s %(process)d %(thread)d %(pathname)[email protected]%(lineno)s: %(message)s'
        },
        'simple': {
            '()': 'djangocolors_formatter.DjangoColorsFormatter', # colored output
            'format': '%(levelname)s %(name)s %(filename)[email protected]%(lineno)s: %(message)s'
        },
    },
     # omitting the handler 'level' setting so that all messages are passed and we do level filtering in 'loggers'
    'handlers': {
        'null': {
            'class':'django.utils.log.NullHandler',
        },
        'console':{
            'class':'logging.StreamHandler',
            'formatter': 'simple',
        },
        'mail_admins': {
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        '': { 
            'handlers': ['mail_admins', 'console'],
            'level': 'WARNING',
        },
    }
}

Пример вывода журнала консоли с использованием django-colors-formatter: Sample console logging output

Ответ 3

Мне также нужен цветной вывод для dev_appserver. Я нашел решения здесь немного OTT (все, что я хотел, это сделать мои вызовы logging.error() выдающимися. Я закончил monkeypatching logging module, отбросив это в моем main.py как быстрое решение:

# monkey patch logger to dump ERRORs in red
import os
if os.environ['SERVER_SOFTWARE'].find('Development') >= 0:
    import logging
    old_error = logging.error
    def red_error(msg,*args,**kwargs):
        old_error("\033[22;31m%s\033[0;0m" % msg, *args, **kwargs)
    logging.error = red_error

Это будет только для терминалов с цветовой кодировкой ANSI.

Ответ 4

Коды reset, упомянутые в ответе, который вы связали, будут работать на консоли на локальном сервере разработки (но, скорее всего, потребуются некоторые настройки), вам придется связать его с существующим обработчиком ведения журнала App Engine), но не будут работать в процессе производства, так как в производственном журнале записи выводятся на HTML-страницу в консоли администратора.

Однако вы можете фильтровать по уровню журнала в консоли администратора.

Ответ 5

Я не считаю, что вам нужно создать подкласс журнала для этого - ответ Airmind прекрасно подходит для создания специализированного Formatter и указания его использования на StreamHandler. Но нет необходимости в подклассе журнала. Фактически, использование класса logger для Airmind добавляет обработчик к каждому созданному журналу, который вам не нужен.

Решение airmind дало только работы для терминалов, которые поддерживают escape-последовательности ANSI - вы уверены, что ваша консоль поддерживает их?

Ответ 6

Вот образец formater:

class Formatter(logging.Formatter) :
    _level_colors  = {
      "DEBUG": "\033[22;32m", "INFO": "\033[01;34m",
      "WARNING": "\033[22;35m", "ERROR": "\033[22;31m",
      "CRITICAL": "\033[01;31m"
     };    

    def format(self, record):
        if(Formatter._level_colors.has_key(record.levelname)):
            record.levelname = "%s%s\033[0;0m" % \
                            (Formatter._level_colors[record.levelname],
                             record.levelname)
        record.name = "\033[37m\033[1m%s\033[0;0m" % record.name
        return logging.Formatter.format(self, record)    

Вам нужно настроить его, например:

...
[formatters]
keys=console_formatter
...
[handler_console_handler]
class=StreamHandler
formatter=console_formatter
args=(sys.stdout,)