Что такое логирование?

Что такое логирование?


Логирование в Python: Методы, Уровни и Настройка
Логирование — это запись событий, происходящих во время работы программы, для последующего анализа. В Python есть несколько способов реализации логирования: от простого print() до продвинутого модуля logging. В этой статье разберём, как эффективно использовать логирование в своих проектах.


Что такое логирование?

Логирование позволяет:

  • Фиксировать ошибки и предупреждения.
  • Отслеживать выполнение программы.
  • Анализировать производительность.
  • Сохранять историю событий для аудита.

Важно: Логирование ? вывод через print(). Оно структурировано, настраивается под задачи и подходит для продакшена.


Методы логирования

1. print()

Плюсы:

  • Простота использования.
  • Подходит для быстрой отладки.
    Минусы:
  • Нет уровней важности сообщений.
  • Нельзя гибко настраивать вывод (например, в файл).
print("Ошибка: файл не найден!")  # Не рекомендуется для серьёзных проектов

2. Syslog

Интеграция с системным журналом (Unix/Linux).

import logging
import logging.handlers

logger = logging.getLogger("my_app")
syslog_handler = logging.handlers.SysLogHandler(address='/dev/log')
logger.addHandler(syslog_handler)
logger.error("Ошибка подключения к базе данных!")

3. Модуль logging

Стандартная библиотека Python для гибкого логирования.

Базовый пример:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.debug("Отладочная информация")  # Не будет выведена (уровень INFO)
logger.info("Запуск приложения")
logger.warning("Низкий уровень памяти!")

4. Запись в файл

Используйте FileHandler или RotatingFileHandler (для ротации логов).

import logging

logging.basicConfig(
    level=logging.DEBUG,
    filename="app.log",
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)

logger = logging.getLogger("file_logger")
logger.error("Ошибка чтения конфигурации")

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

Уровни определяют важность сообщений (от наименее к наиболее критичным):

  1. DEBUG — отладочная информация (например, значения переменных).
  2. INFO — подтверждение работы программы (запуск/остановка).
  3. WARNING — предупреждение о потенциальных проблемах.
  4. ERROR — ошибка, нарушающая часть функционала.
  5. CRITICAL — критическая ошибка, останавливающая приложение.

Пример фильтрации по уровню:

logging.basicConfig(level=logging.WARNING)  # Будут выводиться только WARNING и выше

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

1. Форматирование сообщений

Используйте параметры в format:

  • %(asctime)s — время события.
  • %(levelname)s — уровень важности.
  • %(message)s — текст сообщения.
  • %(filename)s — имя файла, где произошло событие.
formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)

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

Определяют, куда отправляются логи:

  • StreamHandler — вывод в консоль.
  • FileHandler — запись в файл.
  • SMTPHandler — отправка по email.
file_handler = logging.FileHandler("errors.log")
file_handler.setLevel(logging.ERROR)
logger.addHandler(file_handler)

3. Фильтры

Позволяют отсеивать сообщения по условиям.

class NoDebugFilter(logging.Filter):
    def filter(self, record):
        return record.levelno != logging.DEBUG  # Игнорировать DEBUG

logger.addFilter(NoDebugFilter())

4. Пользовательские логгеры

Создавайте отдельные логгеры для разных модулей.

app_logger = logging.getLogger("app.core")
db_logger = logging.getLogger("app.database")

Best Practices

  1. Не используйте root-логгер
    Вместо logging.info() создавайте именованные логгеры:

    logger = logging.getLogger(__name__)
  2. Настройка в начале приложения
    Конфигурируйте логирование при старте, чтобы избежать конфликтов.

  3. Логируйте контекст
    Добавляйте информацию для диагностики:

    logger.error("Ошибка подключения к %s", url, exc_info=True)
  4. Используйте RotatingFileHandler
    Чтобы логи не занимали всю память:

    from logging.handlers import RotatingFileHandler
    handler = RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3)

Заключение

Логирование — ключевой навык для разработки надёжных приложений.

  • Для простых задач подойдёт logging.basicConfig().
  • Используйте разные уровни для фильтрации сообщений.
  • Настраивайте форматы и обработчики под свои нужды.

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

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s: %(message)s")

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)

file_handler = RotatingFileHandler("debug.log", maxBytes=1e6, backupCount=2)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)

logger.addHandler(console_handler)
logger.addHandler(file_handler)

Дополнительные материалы: