Как использовать форматирование сообщений в логах с помощью `logging.Formatter()`?

Использование `logging.Formatter()` позволяет задать структуру вывода сообщений в логах. Вы создаете экземпляр `Formatter` с указанием желаемого формата (например, `%Y-%m-%d %H:%M:%S %levelname - %message`). Затем этот `Formatter` устанавливается для обработчика (Handler), который отвечает за запись логов (например, в файл или консоль). Пример:

import logging
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler = logging.StreamHandler() # Или FileHandler('logfile.log')
handler.setFormatter(formatter)
logger = logging.getLogger('my_logger')
logger.addHandler(handler)
logger.warning('This is a warning message')


Основные placeholder'ы: `%(asctime)s` (время), `%(name)s` (имя логгера), `%(levelname)s` (уровень логирования), `%(message)s` (сообщение).

Форматирование сообщений в логах с помощью logging.Formatter()

Модуль logging в Python предоставляет гибкий механизм для форматирования сообщений логов. Класс logging.Formatter() играет ключевую роль в определении структуры и содержания каждой записи в логе. Он позволяет настроить, какие атрибуты записи лога (время, уровень логирования, имя модуля, сообщение и т.д.) будут включены в вывод и в каком порядке.

Как использовать logging.Formatter()

Основной способ использования logging.Formatter() — это создание его экземпляра с указанием строки формата. Эта строка формата использует синтаксис, аналогичный строкам форматирования Python (%-форматирование или str.format()). Однако, вместо переменных, в строке формата используются так называемые "log record attributes".

Вот пример базового использования:


import logging

# 1. Создаем Formatter с желаемым форматом
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 2. Создаем Handler (например, StreamHandler для вывода в консоль)
handler = logging.StreamHandler()
handler.setFormatter(formatter)

# 3. Получаем Logger
logger = logging.getLogger('my_application')
logger.setLevel(logging.DEBUG)  # Устанавливаем минимальный уровень логирования

# 4. Добавляем Handler к Logger
logger.addHandler(handler)

# 5. Используем Logger для записи сообщений
logger.debug('Это сообщение отладки.')
logger.info('Это информационное сообщение.')
logger.warning('Это предупреждение.')
logger.error('Это сообщение об ошибке.')
logger.critical('Это критическая ошибка.')
  

В этом примере:

  • %(asctime)s: Время создания записи лога.
  • %(name)s: Имя логгера (в данном случае 'my_application').
  • %(levelname)s: Уровень логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL).
  • %(message)s: Само сообщение, которое мы передаем в logger.debug(), logger.info() и т.д.

Доступные атрибуты Log Record

logging.Formatter() может использовать множество других атрибутов записи лога. Вот некоторые из наиболее распространенных:

  • %(name)s: Имя логгера.
  • %(levelno)s: Численное значение уровня логирования (например, 10 для DEBUG, 20 для INFO).
  • %(levelname)s: Текстовое представление уровня логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL).
  • %(pathname)s: Полный путь к исходному файлу, в котором было вызвано сообщение лога.
  • %(filename)s: Имя файла, в котором было вызвано сообщение лога.
  • %(module)s: Имя модуля, в котором было вызвано сообщение лога.
  • %(funcName)s: Имя функции, в которой было вызвано сообщение лога.
  • %(lineno)d: Номер строки в исходном файле, где было вызвано сообщение лога.
  • %(asctime)s: Время создания записи лога в удобочитаемом формате. Формат по умолчанию - %Y-%m-%d %H:%M:%S,uuu, но его можно изменить с помощью параметра datefmt при создании Formatter.
  • %(process)d: ID процесса.
  • %(thread)d: ID потока.
  • %(message)s: Текст сообщения.

Настройка формата времени (datefmt)

Вы можете настроить формат времени с помощью параметра datefmt в конструкторе logging.Formatter(). Например:


import logging

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

handler = logging.StreamHandler()
handler.setFormatter(formatter)

logger = logging.getLogger('my_application')
logger.addHandler(handler)

logger.info('Информационное сообщение.')
  

В этом случае время будет отформатировано как "YYYY-MM-DD HH:MM:SS".

Примеры различных форматов


import logging

# Пример 1: Подробная информация, включая имя файла и номер строки
formatter1 = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s')

# Пример 2: Короткий формат, только время и сообщение
formatter2 = logging.Formatter('%(asctime)s - %(message)s', datefmt='%H:%M:%S')

# Пример 3:  Включает имя логгера
formatter3 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  

Почему это важно?

Правильное форматирование логов критически важно для:

  • Анализа и отладки: Легко находить нужную информацию, когда сообщения логирования структурированы и содержат важные атрибуты.
  • Мониторинга: Автоматически обрабатывать и анализировать логи с помощью специализированных инструментов.
  • Понимания поведения приложения: Отслеживать последовательность событий и выявлять проблемы.

В заключение

logging.Formatter() — мощный инструмент для настройки вида сообщений логов в Python. Понимание его возможностей позволяет создавать более информативные и удобные для анализа логи, что значительно упрощает отладку, мониторинг и понимание работы приложения. Не забывайте выбирать формат, который наилучшим образом соответствует потребностям вашего проекта.

0