Сообщить об ошибке.

Класс Formatter() модуля logging в Python

Задать строку формата для логирования событий

Объект logging.Formatter отвечает за преобразование logging.LogRecord в строку, которая может быть интерпретирована как человеком, так и внешней системой.

Синтаксис:

import logging

logging.Formatter(fmt=None, datefmt=None, style='%')

Параметры:

  • fmt=None - строка формата сообщения,
  • datefmt=None - строка формата времени,
  • style='%' - стиль форматирования при передачи аргументов строке с сообщением.

Возвращаемое значение:

Описание:

Класс Formatter() модуля logging возвращает новый экземпляр класса logging.Formatter. Экземпляр инициализируется строкой формата fmt для сообщения в целом, а также строкой формата datefmt для части даты/времени сообщения.

  • Если аргумент fmt не указан, то в качестве сообщения используется '%(message)s', которое просто включает сообщение в вызов журнала.
  • Если аргумент datefmt не указан, то используется формат, который описан в документации к методу Formatter.formatTime().

Средство форматирования может быть инициализировано строка формата сообщения fmt, в которой используются знания атрибутов logging.LogRecord, таких как значение по умолчанию '%(message)s', с использованием объединения сообщения и аргументов пользователя предварительно отформатированных в атрибуте сообщения LogRecord. Строка формата fmt по умолчанию форматируется в стиле printf.

Параметр style может быть одним из '%', '{' или '$' и определяет, как строка формата будет объединена с его данными: с использованием одного из % - по умолчанию, str.format() или string.Template().

Методы объекта Formatter.


formatter.format(record):

Метод formatter.format() представляет собой словарь атрибутов записи record, который используется в качестве операнда для операции форматирования строки. Возвращает полученную строку.

Перед форматированием словаря необходимо выполнить пару подготовительных шагов.

  • Атрибут сообщения записи вычисляется с использованием выражения msg % args.
  • Если строка форматирования содержит (asctime), то вызывается метод formatter.formatTime() для форматирования времени события.
  • Если есть информация об исключении, она форматируется с использованием метода formatter.formatException() и добавляется к сообщению.

Обратите внимание, что отформатированная информация об исключении кэшируется в атрибуте exc_text. Это полезно, потому что эта информация может быть выбрана и отправлена ​​по сети, но необходимо быть осторожным, если есть более одного подкласса Formatter, который настраивает форматирование информации об исключении. В этом случае придется очистить кешированное значение после того, как Formatter выполнил свое форматирование, чтобы следующий Formatter, обрабатывающий событие, не использовал кешированное значение, а пересчитал его заново.

Если информация стека доступна, чтобы при необходимости ее преобразовать, она добавляется после информации об исключении, при этом используется метод formatter.formatStack().

formatter.formatTime(record, datefmt=None):

Метод formatter.formatTime() возвращает строку с временем/датой. Метод должен вызываться из метода formatter.format() средством форматирования, в котором нужно использовать отформатированное время. Этот метод может быть переопределен в средствах форматирования, но основное поведение таково: если указана строка datefmt, то он используется с функцией time.strftime() для форматирования времени создания записи. В противном случае используется формат ‘%Y-%m-%d %H:%M:%S,uuu’, где часть uuu представляет собой значение в миллисекундах, а остальные буквы соответствуют документации time.strftime(). Пример времени в формате по умолчанию: 2020-11-23 00: 29: 50,411.

Метод использует настраиваемую пользователем функцию для преобразования времени создания в кортеж. По умолчанию используется time.localtime(). Чтобы изменить это для конкретного экземпляра Formatter, установите для атрибута converter функцию с такой же сигнатурой, что и у time.localtime() или time.gmtime(). Чтобы изменить его для всех форматеров, если например необходимо чтобы все время регистрации отображалось в GMT, установите атрибут converter в классе logging.Formatter.

formatter.formatException(exc_info):

Метод formatter.formatException() форматирует и возвращает указанную информацию об исключении в виде строки. Аргумент exc_info это стандартный кортеж исключения, возвращаемый sys.exc_info() в виде строки.

Эта реализация по умолчанию просто использует traceback.print_exception().

formatter.formatStack(stack_info):

Метод formatter.formatStack() форматирует и возвращает указанную информацию стека в виде строки.. Аргумент stack_info это строка, возвращаемая traceback.print_stack(), но с удаленным последним переводом строки.

Эта реализация по умолчанию просто возвращает входное значение.


Пример создания и использования объекта Formatter:

# test.py
import logging

# создаем регистратор
logger = logging.getLogger('logger')
logger.setLevel(logging.DEBUG)

handler = logging.FileHandler('example.log')
handler.setLevel(logging.DEBUG)

# строка формата сообщения
strfmt = '[%(asctime)s] [%(name)s] [%(levelname)s] > %(message)s'
# строка формата времени
datefmt = '%Y-%m-%d %H:%M:%S'
# создаем форматтер
formatter = logging.Formatter(fmt=strfmt, datefmt=datefmt)
# добавляем форматтер к 'ch'
handler.setFormatter(formatter)

logger.addHandler(handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

Запуск этого кода приведет к созданию файла 'example.log' с записями внутри:

[2020-06-08 07:42:59] [logger] [DEBUG] > debug message
[2020-06-08 07:42:59] [logger] [INFO] > info message
[2020-06-08 07:42:59] [logger] [WARNING] > warn message
[2020-06-08 07:42:59] [logger] [ERROR] > error message
[2020-06-08 07:42:59] [logger] [CRITICAL] > critical message