Логирование в Python

Статьи

Введение

Логирование является важной частью разработки программного обеспечения, которая позволяет отслеживать и регистрировать различные события, ошибки и предупреждения в процессе работы программы.

В данной статье разберёмся, как работает логирование в Python с использованием модуля logging, входящего в стандартную библиотеку Python.

Модуль logging

Модуль logging предоставляет гибкую функциональность для записи сообщений в различные источники, такие как консоль, файлы, сетевые сокеты и т.д.

Основные концепции логирования

Логгеры (Loggers)

Логгер — это основной объект, который используется для записи логов. Обычно логгеры именуются по иерархии пакетов модуля, в котором они создаются, например my_module.submodule.

Обработчики (Handlers)

Обработчики определяют, куда будут направляться сообщения логов: в файл, в консоль, по сети и т.д. Один логгер может иметь несколько обработчиков.

Форматтеры (Formatters)

Форматтеры используются для определения формата выходных сообщений логов. Формат может включать время, уровень важности, имя логгера и само сообщение.

Уровни логирования

Модуль поддерживает различные уровни логирования, что позволяет различать критичность сообщений:

  • DEBUG: Подробные сообщения, используемые для диагностики.
  • INFO: Сообщения общего характера, подтверждающие нормальную работу.
  • WARNING: Указание на потенциальную проблему.
  • ERROR: Ошибка, не приводящая к завершению программы.
  • CRITICAL: Ошибка, приводящая к завершению программы.

Настройка логирования

Чтобы начать логирование, необходимо импортировать модуль и настроить базовую конфигурацию, используя функцию basicConfig с параметром level, установленным logging.INFO. Тем самым мы настроили корневой логгер для записи сообщений с уровнем серьезности INFO и выше:

import logging

logging.basicConfig(level=logging.INFO)
logging.info('Это сообщение уровня INFO')
logging.debug('Это сообщение уровня DEBUG, не будет отображено, так как уровень INFO выше')
Функция basicConfig() настраивает систему логирования с базовой конфигурацией. Она создаёт экземпляр класса StreamHandler с форматированием по умолчанию и добавляет его в корневой логгер. Корневой логгер является верхним уровнем в иерархии логгеров и используется по умолчанию, если не указан другой логгер.
Установив параметр level=logging.INFO, корневой логгер будет записывать только сообщения с уровнем серьезности INFO и выше. Это означает, что сообщения с уровнями серьезности DEBUG или WARNING не будут записываться.

Настройка логгера, обработчика и форматтера

Для более гибкой настройки можно создать логгер, обработчик и форматтер отдельно:

import logging

# Создаем логгер
logger = logging.getLogger('example_logger')
logger.setLevel(logging.DEBUG)

# Создаем обработчик для записи логов в файл
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)

# Создаем форматтер и добавляем его к обработчику
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# Добавляем обработчик к логгеру
logger.addHandler(file_handler)

# Логируем сообщения
logger.debug('Это отладочное сообщение')
logger.info('Это информационное сообщение')
logger.warning('Это предупреждающее сообщение')
logger.error('Это сообщение об ошибке')
logger.critical('Это критическое сообщение')

Использование нескольких обработчиков

Один логгер может иметь несколько обработчиков, что позволяет направлять логи в разные места:

# Создаем еще один обработчик для вывода в консоль
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.ERROR)
console_handler.setFormatter(formatter)

# Добавляем обработчик к логгеру
logger.addHandler(console_handler)

# Теперь ошибки и критические сообщения будут выводиться в консоль, а все сообщения — в файл
logger.error('Это сообщение об ошибке, будет видно и в консоли, и в файле')

Итоговый код будет выглядеть следующим образом:

import logging

# Создаем логгер
logger = logging.getLogger('example_logger')
logger.setLevel(logging.DEBUG)

# Создаем обработчик для записи логов в файл
file_handler = logging.FileHandler('example.log')
file_handler.setLevel(logging.DEBUG)

# Создаем форматтер и добавляем его к обработчику
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# Добавляем обработчик к логгеру
logger.addHandler(file_handler)

# Логируем сообщения
logger.debug('Это отладочное сообщение')
logger.info('Это информационное сообщение')
logger.warning('Это предупреждающее сообщение')
logger.error('Это сообщение об ошибке')
logger.critical('Это критическое сообщение')

# Создаем еще один обработчик для вывода в консоль
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.ERROR)
console_handler.setFormatter(formatter)

# Добавляем обработчик к логгеру
logger.addHandler(console_handler)

# Теперь ошибки и критические сообщения будут выводиться в консоль, а все сообщения — в файл
logger.error('Это сообщение об ошибке, будет видно и в консоли, и в файле')

Настройка логирования через конфигурационный файл

Логирование также можно настраивать через конфигурационный файл в формате YAML или JSON, что удобно для больших проектов.

Пример конфигурации в формате YAML:

version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
  file:
    class: logging.FileHandler
    level: DEBUG
    formatter: simple
    filename: example.log
loggers:
  example_logger:
    level: DEBUG
    handlers: [console, file]
    propagate: no
root:
  level: DEBUG
  handlers: [console]

Использование этой конфигурации:

import logging.config
import yaml

with open('logging_config.yaml', 'r') as f:
    config = yaml.safe_load(f.read())
    logging.config.dictConfig(config)

logger = logging.getLogger('example_logger')
logger.debug('Это отладочное сообщение')
logger.info('Это информационное сообщение')

Заключение

В ходе статьи мы с Вами что такое логирование и как с ним работать в на Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Admin
Admin
IT Start