Ответ
Логгер — это объект, который предоставляет приложению интерфейс для записи событий (логов). Вместо использования print()
для отладки, логгеры позволяют гибко управлять выводом сообщений, их форматом и назначением (консоль, файл, удаленный сервис).
В Python для этого используется встроенный модуль logging
.
Основные компоненты logging
:
- Logger: Основной объект, с которым взаимодействует код (
logger.info(...)
). - Handler: Определяет, куда отправляются логи (например,
StreamHandler
в консоль,FileHandler
в файл). - Formatter: Задает формат вывода лог-сообщений (время, уровень, текст).
Уровни логирования (по возрастанию важности):
DEBUG
: Детальная информация для диагностики проблем.INFO
: Подтверждение, что все работает штатно.WARNING
: Указание на потенциальную проблему.ERROR
: Ошибка, из-за которой программа не смогла выполнить какую-то функцию.CRITICAL
: Серьезная ошибка, которая может привести к аварийному завершению программы.
Пример настройки (best practice):
import logging
# 1. Создаем логгер. Принято называть его по имени модуля.
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # Устанавливаем минимальный уровень для логгера
# 2. Создаем обработчик (хендлер) для вывода в консоль
ch = logging.StreamHandler()
ch.setLevel(logging.INFO) # Устанавливаем уровень для конкретного обработчика
# 3. Создаем форматер и добавляем его в обработчик
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
# 4. Добавляем обработчик в логгер
logger.addHandler(ch)
# Используем логгер
logger.debug("Это сообщение для отладки. Оно не появится в консоли.")
logger.info("Приложение успешно стартовало.")
logger.warning("Внимание: используется устаревшая конфигурация.")
Почему это лучше, чем print()
?
- Уровни важности: Легко фильтровать сообщения (например, показывать только ошибки в production).
- Гибкость вывода: Можно одновременно писать логи в консоль, файл и отправлять по сети, не меняя код приложения.
- Контекст: Автоматически добавляется полезная информация (время, имя модуля, номер строки).