Python. Модуль логирования с визуализацией иерархических структур.

Python Logging ModuleСтолкнулся с необходимостью красиво оформлять вывод в консоли, чтобы отслеживать иерархию данных. Также, захотелось при необходимости этот вывод сохранять в файлы. Для этих целей был написан небольшой модуль. Поскольку он получился автономным и достаточно обобщенным, выкладываю для ознакомления.

Скачать ZIP архив: logger-0.1.8.zip

Для примера можно запустить demo_logger.py. Для затравки сразу приведу код примера и скрин консоли.

Исходный код примера:

Вот что мы получим:

import logger

log = logger.Logger()

log.txt('''
This is the test case to see how is the log formatting works.
Here we use most of the main logging functionality and all
possible formatting features. You can use this unit test case
as an usage help.
 ''')
log.tag('Logger demo.')
log.msg('Lorem ipsum dolor sit amet.', signature='0')
log.go_indent()
log.tag('indent')
log.msg('Lorem ipsum dolor sit amet.', signature='1')
log.msg('Lorem ipsum dolor sit amet.', signature='1')
log.go_indent()
log.dum()
log.tag('indent')
log.msg('Lorem ipsum dolor sit amet.', signature='2')
log.msg('Lorem ipsum dolor sit amet.', signature='2')
log.go_indent()
log.txt('''
Plain text insertion.
 ''')
log.tag('indent')
log.msg('Lorem ipsum dolor sit amet.', signature='3')
log.msg('Lorem ipsum dolor sit amet.', signature='3')
log.par({
    'key1': 'val1',
    'key2': 'val2',
    'key3': 'val3',
    'key4': 'val4',
    'key5': 'val5',
    'key6': 'val6',
    'key7': 'val7',
    '_key8': 'val8',
    '_key9': 'val9',
})
log.go_undent()
log.tag('undent')
log.go_undent()
log.tag('undent')
log.msg('Lorem ipsum dolor sit amet.', signature='1')
log.par({
    'value': 1.253273468347,
    'energy': 345.1231232347,
    'plasticity': .45234234,
})
log.msg('Lorem ipsum dolor sit amet.', signature='1')
log.par({
    'key1': 'val1',
    'key2': 'val2',
    'key3': 'val3',
    'key4': 'val4',
    'key5': 'val5',
    'key6': 'val6',
    'key7': 'val7',
    '_key8': 'val8',
    '_key9': 'val9',
})
log.go_undent()
log.tag('undent')
log.msg('Lorem ipsum dolor sit amet.', signature='0')
log.msg('Lorem ipsum dolor sit amet.', signature='0')

log.show()

Принцип работы

Создаем объект класса Logger(). Далее вызываем методы, добавляющие в логгер данные (dum, tag, msg, par, txt). Эти методы позволяют управлять уровнем вывода (level) и уровнем вложенности (indent). Также, для удобства имеются методы: go_indent() и go_undent(), соответственно увеличивающие и уменьшающие вложенность.

Перечень функций и краткое описание можно увидеть вызвав стандартную справку:

 >>> import logger
 >>> help(logger)

Получить отформатированный лог можно тремя способами:

  1. В виде строки, вызвав метод render().
  2. На экран, вызовом метода show().
  3. Сохранив в файл, вызовом метода save().

Каждому из этих методов можно передать значение verbose, которое определяет уровень требуемого логирования.

Константы:

L_NONE - ничего не выводить
L_ALL - выводить всё
L_STRUCTURE - данные по структуре (модули, объекты, ID, связи и т.п.)
L_CONDITION - данные по состоянию (значения переменных, свойств, содержимое массивов и т.п.)
L_BASICS - базовый уровень, ознакомительная информация
L_NORMAL - средний уровень, информация для базовой отладки
L_STRICT - параноидальный уровень для детальной отладки
L_MODEL - данные структуры и состояния
L_ABOUT - базовый + средний уровень вывода
L_WHOLE - базовый + средний + параноидальный уровни вывода
L_BASIC_MODEL - базовая информация по модели
L_BASIC_STRUCTURE - базовая информация по структуре
L_BASIC_CONDITION - базовая информация по состоянию
L_ABOUT_MODEL - базовый + средний уровень вывода по модели
L_ABOUT_STRUCTURE - базовый + средний уровень вывода по структуре
L_ABOUT_CONDITION - базовый + средний уровень вывода по состоянию
L_WHOLE_MODEL - базовый + средний + параноидальный уровень вывода по модели
L_WHOLE_STRUCTURE - базовый + средний + параноидальный уровень вывода по структуре
L_WHOLE_CONDITION - базовый + средний + параноидальный уровень вывода по состоянию
L_NOTICE - нотификация логгера
L_WARNING - предупреждения логгера
L_ERROR - ошибки логгера

I_SPACER - симфолы отступа
I_SEPARATOR - символы разделителя
I_INDENT - отступ по умолчанию

O_TEXT_WIDTH - ширина текста (строка параметров разбивается на несколько и переносится по этой ширине)

Свойства:

log = logger.Logger()

log.verbose - см. константы L_*, можно комбинировать L_N1 ^ L_N2 ^ ...
log.level - уровень логирования по умолчанию, когда не указывается явно для сообщения
log.indent - текущий отступ (см. методы go_indent и go_undent)

Методы:

log.dum(level=None, indent=None)

Выводит пустую (Dummy) строку, в которой только иерархические символы.

level - уровень логирования (если не задан, используется log.level)
indent - отступ (если не указан, используется log.indent

log.tag(text, level=None, indent=None)

Выводит тег в квадратных скобках: [Текст]

level - уровень логирования (если не задан, используется log.level)
indent - отступ (если не указан, используется log.indent

log.msg(text, signature=None, level=None, indent=None)

Выводит сообщение вида:
[сигнатура] Текст сообщения.

level - уровень логирования (если не задан, используется log.level)
indent - отступ (если не указан, используется log.indent

log.par(params, level=None, indent=None)

Выыводит строку параметров вида:
: key1=val1; key2=val2; key3=val3; ...

Если длина строки превышает O_TEXT_WIDTH, разбивает вывод на несколько строк.
params - словарь (dict) с произвольным набором параметров ключ/значение.

level - уровень логирования (если не задан, используется log.level)
indent - отступ (если не указан, используется log.indent

log.txt(text, level=None, indent=None)

Вывод текстовой вставки вида:
;
; Текст
;
Сохраняет оригинальное форматирование.

level - уровень логирования (если не задан, используется log.level)
indent - отступ (если не указан, используется log.indent

log.go_indent()

Увеличивает уровень вложения.

log.go_undent()

Уменьшает уровень вложения.

log.flush()

Очищает сохраненные данные.

log.render(verbose=None)

Возвращает отформатированный текст лога, обрабатываются только сообщения, отвечающие уровню verbose.
Если не указан явно, по умолчанию берется log.verbose.

log.save(path, verbose=None, append=False)

path - путь к файлу;
verbose - уровень вывода;
append - флаг добавления в конец файла (по умолчанию перезаписывает существующий).

log.show(verbose=None)

Выводит отфрматированный лог в консоль.

verbose - уровень вывода

log.assign(logger, append=False)

Принимает данные из другого логгера.

append - флаг присоединения в конец своих данных.

Поделитесь с друзьями:



Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>