вторник, 11 августа 2015 г.

Делаем цветной вывод логов

Самый простой вариант -- используя цветовые коды и print
print u"\x1b[31;40mЧто-то красное на чёрном\x1b[0m"

Но использовать такую конструкцию очень сложно, особенно если цветовых вариантов больше одного. Да и замена цвета будет той ещё головной болью...
Можно составить "карту" цветов и использовать в виде переменных (или подключить colorama), но это очень неудобно. Примеры в комментах. Или.
Особенно, когда нужно несколько цветов по разным уровням ошибки, и появляется обёртка вида
def mylog-red-black(string):
    print u"\x1b[31;40m%s\x1b[0m" % (string,)
....

Дальше появляется желание унификации, и пачка функций превращается в одну, вида
def mylog(level, string)
где уже единое управление цветами и можно отключить вывод какого-то уровня, просто закомментировав нужный print...
Потом появляется желание сделать вывод в лог, но например только уровней WARNING, ERROR, CRITICAL. Вроде несложно, доработали mylog, добавив в нужные секции "открыть-записать-закрыть".
Со временем функция превращается в класс, чтобы можно было его наследовать и вести несколько разных логов или изменять поведение (цвета например).
А потом захотелось пересылать логи на другой сервер,

Особым вопросом встанет мультиплатформенный вывод в консоль, так как "есть нюансы", хорошо описано тут
Как я боролся с кодировками в консоли
Плюс, если вывод просто в std*, нужен анализ, это консоль или пайп, чтобы при запуске test.py > log в этот самый лог не попадала цветовая раскраска, она будет только мешать.

В результате, можно писать такое самим, а можно взять стандартный класс logging и найти под него handler. Но тут будет другая проблема -- у меня получилось более десятка всяких цветных handler-ов, с разными возможностями. Тоже выбрать - та ещё проблема.

Итак, варианты
AnsiColorFormatter - в зависимостях Fabric, вероятно с ним и надо использовать
ColorizingStreamHandler - есть поддержка перенаправлений
colorlog - по всей вероятности, нет переопределения цветов
chromalog
rainbow_logging_handler, сам класс есть в pypi/pip:
rainbow_logging_handler   - Ultimate Python colorized logger with user-custom color
coloredlogs
ConsoleColorFormatter

Pyramid

И так далее.

Для "быстрого старта" можно взять rainbow_logging_handler, использовать так:
1) pip install rainbow_logging_handler
2) в код добавляем импорты
import sys
from rainbow_logging_handler import RainbowLoggingHandler
3) в conf файл - секцию
[handler_colorHandler]
class=rainbow_logging_handler.RainbowLoggingHandler
level=DEBUG
formatters=simpleFormatter
args=(sys.stdout,)
плюс обвязку, тот же simpleFormatter, а также описать в [handlers] и прочем.
4) в коде подключаем конф как ообычно, например
logging.config.fileConfig("logging.conf")
log = logging.getLogger(__name__)
(не забываем, что fileConfig должен быть выше создания getLogger-ов)
5) для тета
logging.debug("debug")
logging.info("info")
logging.warn("warn")
logging.error("error")
logging.critical("critical")
logging.exception("exception")

За основу хорошо взять

Комментариев нет:

Отправить комментарий