Объект logging.Formatter
отвечает за преобразование logging.LogRecord
в строку, которая может быть интерпретирована как человеком, так и внешней системой.
import logging logging.Formatter(fmt=None, datefmt=None, style='%')
fmt=None
- строка формата сообщения,datefmt=None
- строка формата времени,style='%'
- стиль форматирования при передачи аргументов строке с сообщением.Formatter
.Класс 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()
,formatter.formatTime()
,formatter.formatException()
,formatter.formatStack()
,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