Как сделать цвет регистрации в 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,)