class_desc/classes/logger.md


Класс Logger

Класс Logger реализует систему журналирования для приложения. Он позволяет:

  • централизованно управлять логированием сообщений разных уровней;
  • настраивать минимальный уровень логирования (фильтрация сообщений);
  • подключать несколько обработчиков логов (ILogHandler) для вывода в разные места (консоль, файл, сеть и т.д.);
  • гибко конфигурировать систему через словарь настроек;
  • использовать единый форматтер (ILogFormatter) для всех обработчиков;
  • вызывать логирование через удобные методы‑обёртки (debug(), info(), error() и т.д.).

Основная информация

  • Имя файла: anb_python_components/classes/logger.py
  • Автор: Александр Бабаев
  • Версия: 1.0.0
  • Дата начала поддержки: с версии 1.5.0

Методы класса

Конструктор (__init__)

Инициализирует экземпляр системы журналирования.

Сигнатура:

def __init__ (self, config: dict[str, Any] = None):
    ...

Параметры:

Параметр Тип Описание
config dict[str,Any] | None Необязательный словарь с конфигурацией системы журналирования. Если не указан, используются настройки по умолчанию

Пример использования:

from anb_python_components import Logger

logger = Logger()

add_handler

Добавляет обработчик в массив обработчиков.

Сигнатура:

def add_handler (self, handler: ILogHandler) -> None:
    ...

Параметры:

Параметр Тип Описание
handler_ ILogHandler Экземпляр обработчика логов, реализующий интерфейс ILogHandler

Поведение:

  • Проверяет, не был ли обработчик такого типа уже добавлен (выбрасывает ValueError, если да).
  • Передаёт обработчику текущую конфигурацию (__config) и форматтер (__formatter).

Пример использования:

from anb_python_components import Logger, ConsoleLogHandler

logger = Logger()
logger.add_handler(ConsoleLogHandler())

set_formatter

Устанавливает обработчик сообщений (форматтер).

Сигнатура:

def set_formatter (self, formatter: ILogFormatter, update_handlers: bool = True) -> None:
    ...

Параметры:

Параметр Тип Описание
formatter ILogFormatter Экземпляр форматтера, реализующий интерфейс ILogFormatter
update_handlers bool Флаг, указывающий, нужно ли обновить форматтер во всех уже подключённых обработчиках. По умолчанию True

Пример использования:

from anb_python_components import Logger, JsonLogFormatter

logger = Logger()
logger.set_formatter(JsonLogFormatter())

set_config

Устанавливает (обновляет) конфигурацию системы журналирования.

Сигнатура:

def set_config (self, config: dict[str, Any]) -> None:
    ...

Параметры:

Параметр Тип Описание
config dict[str,Any] Словарь с параметрами конфигурации (уровень логирования, форматтер, список обработчиков и т.д.)

Особенности:

  • автоматически устанавливает уровень логирования (__min_level);
  • обновляет форматтер (если указан);
  • очищает текущий список обработчиков и добавляет новые из конфигурации.

set_level

Устанавливает минимально допустимый тип журналируемого события.

Сигнатура:

def set_level (self, level: MessageType | int) -> None:
    ...

Параметры:

Параметр Тип Описание
level MessageType|int Уровень логирования (например, DEBUG, INFO, WARNING, ERROR). Сообщения ниже этого уровня игнорируются

Пример:

logger.set_level(MessageType.INFO)  # Будут логироваться INFO, WARNING, ERROR и т. д.
...
logger.set_level(20)  # Будут логироваться WARNING, ERROR и т. д.

log

Добавляет сообщение в журнал.

Сигнатура:

def log (self, level: MessageType | int, message: str, context: dict[str, Any] = None) -> None:
    ...

Параметры:

Параметр Тип Описание
level MessageType|int Уровень сообщения
message str Текст сообщения журнала
context dict[str,Any]|None Необязательный словарь с дополнительной контекстной информацией

Логика:

  • проверяет, превышает ли уровень сообщения минимальный (__is_level_enabled);
  • если да, передаёт сообщение всем подключённым обработчикам (handle).

Вспомагательные методы для более простых случаев

Удобные методы для логирования сообщений определённого уровня:

  • debug(message: str, context: dict[str, Any] = None)log(MessageType.DEBUG, ...)
  • info(message: str, context: dict[str, Any] = None)log(MessageType.INFO, ...)
  • success(message: str, context: dict[str, Any] = None)log(MessageType.SUCCESS, ...)
  • warning(message: str, context: dict[str, Any] = None)log(MessageType.WARNING, ...)
  • stop(message: str, context: dict[str, Any] = None)log(MessageType.STOP, ...)
  • critical(message: str, context: dict[str, Any] = None)log(MessageType.CRITICAL, ...)
  • error(message: str, context: dict[str, Any] = None)log(MessageType.ERROR, ...)

Пример использования:

logger.info("Приложение запущено")
logger.error("Ошибка подключения к БД", {"db_host": "localhost"})

close

Закрывает всех обработчики и завершения работы системы журналирования. Необходим при работе с буферами.

Сигнатура:

def close (self) -> None:
    ...

Параметры: нет.

Пример:

logger = Loger(...)
...
logger.close();  # Далее, нам нельзя ничего записывать в журнал!

ВАЖНО! Ни в коем случае не вызывать в деструкторе класса! Иначе возможны ошибки. Например,

Exception ignored while calling deallocator <function BufferedRotatingFileHandler.__del__ at ***:
Traceback (most recent call last):
File "...\log_handlers\buffered_rotating_file_handler.py", line 57, in __del__
File "...\log_handlers\buffered_rotating_file_handler.py", line 107, in __flush
NameError: name 'open' is not defined

Примеры использования

Пример 1: Базовая настройка и логирование

from anb_python_components import Logger, ConsoleLogHandler, RussianLogFormatter, MessageType

# Создаём логгер
logger = Logger()

# Устанавливаем форматтер
logger.set_formatter(RussianLogFormatter())

# Добавляем обработчик вывода в консоль
logger.add_handler(ConsoleLogHandler())

# Устанавливаем уровень логирования
logger.set_level(MessageType.DEBUG)

# Логируем сообщения
logger.debug("Отладочная информация")
logger.info("Информационное сообщение")
logger.error("Произошла ошибка", {"user_id": 123})

Пример 2: Настройка через конфигурацию

from anb_python_components import FileHandler, Logger, MessageType, RussianLogFormatter

config = {
    'base': {
        'level': MessageType.WARNING,
        'formatter': RussianLogFormatter(),
        'handlers': [FileHandler()],
    },
    'file_handler': {
        'file': "test.log"
    }
}

logger = Logger(config)

logger.warning("Предупреждение: низкий уровень заряда батареи")

Сценарии применения

Класс Logger полезен в следующих случаях:

  • Централизованное логирование в приложениях с модульной архитектурой.
  • Гибкая настройка вывода логов — можно одновременно выводить сообщения в консоль (для отладки), в файл (для архивации) и в централизованную систему мониторинга (например, ELK Stack).
  • Фильтрация по уровням логирования — настройка минимального уровня (DEBUG, INFO, WARNING и т. д.) позволяет контролировать объём выводимой информации без изменения кода.
  • Динамическая смена формата логов — переключение между текстовым, JSON и другими форматами на лету через set_formatter().
  • Интеграция с внешними системами — подключение кастомных обработчиков (ILogHandler) для отправки логов в Slack, Telegram, системы мониторинга (Prometheus, Grafana) или базы данных.
  • Контекстное логирование — передача дополнительной информации (context) вместе с сообщением для упрощения отладки и анализа ошибок.
  • Автоматизация настройки — использование конфигурации (set_config()) для управления логированием через конфигурационные файлы или переменные окружения.
  • Тестирование — возможность подменять обработчики и форматтеры на заглушки (mocks) в юнит‑тестах для проверки логики логирования.
  • Масштабирование — добавление новых обработчиков без изменения основной логики приложения (например, подключение обработчика для отправки критических ошибок в мессенджер).

Важные особенности

  • Защита от дублирования обработчиков — метод add_handler() проверяет, не был ли обработчик такого типа уже добавлен, и выбрасывает ValueError при попытке дублирования.
  • Автоматическая синхронизация — при смене форматтера (set_formatter()) он автоматически применяется ко всем подключённым обработчикам (если update_handlers=True).
  • Безопасная обработка конфигурации — метод set_config() содержит защиту от некорректных значений (например, автоматически устанавливает MessageType.WARNING, если переданный уровень не соответствует MessageType).
  • Игнорирование низкоприоритетных сообщений — сообщения с уровнем ниже __min_level не передаются обработчикам, что снижает нагрузку на систему.
  • Поддержка контекста — все методы логирования позволяют передавать словарь context с дополнительной информацией (ID пользователя, параметры запроса, метаданные и т. д.).

Рекомендации по использованию

  • Инициализация — создавайте один экземпляр Logger на приложение и передавайте его компонентам.
  • Настройка уровня логирования:

  • в разработке: MessageType.DEBUG для максимальной детализации;

  • в продакшене: MessageType.INFO или MessageType.WARNING для снижения объёма логов.

  • Использование методов‑обёрток (debug(), info(), error() и т. д.) вместо прямого вызова log() для улучшения читаемости кода.

  • Передача контекста — используйте параметр context для передачи данных, помогающих воспроизвести ошибку (например, {" user_id": 123, “request_id”: “abc123”}).
  • Централизованная конфигурация — управляйте логированием через единый конфигурационный файл или переменные окружения с помощью set_config().
  • Тестирование — используйте заглушки для ILogHandler и ILogFormatter в тестах, чтобы избежать реального вывода логов.

На главную