class_desc/protocols/i_log_handler.md
Интерфейс ILogHandler
Интерфейс ILogHandler определяет контракт для классов, отвечающих за обработку и вывод сообщений системы журналирования. Он позволяет:
- управлять форматом вывода логов через подключение различных форматтеров (
ILogFormatter); - настраивать параметры логирования динамически;
- направлять логи в различные конечные точки (файл, консоль, сеть, очередь и т.д.);
- гибко конфигурировать систему журналирования без изменения основной логики приложения.
Основная информация
- Имя файла:
anb_python_components/protocols/i_log_handler.py - Автор: Александр Бабаев
- Версия: 1.0.0
- Дата начала поддержки: с версии 1.5.0
Методы интерфейса
set_formatter
Устанавливает обработчик сообщений (форматтер).
Сигнатура:
def set_formatter (self, formatter: ILogFormatter) -> None:
pass
Параметры:
| Параметры | Тип | Описание |
|---|---|---|
| formatter | ILogFormatter | Экземпляр класс‑форматтера, реализующий интерфейс ILogFormatter. Определяет правила форматирования логов. |
Возвращаемое значение: None
get_formatter
Возвращает текущий форматтер.
Сигнатура:
def get_formatter (self) -> ILogFormatter:
pass
Параметры: Нет.
Возвращаемое значение:
- ILogFormatter: Текущий экземпляр форматтера, используемый для форматирования сообщений.
set_config
Устанавливает настройки системы журналирования.
Сигнатура:
def set_config (self, config: dict[str, Any]) -> None:
pass
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
| config | dict[str,Any] | Словарь с параметрами конфигурации системы журналирования (например, путь к файлу логов, уровень детализации, флаги вывода и т. д.). |
Возвращаемое значение: None
get_config_section
Возвращает название секции в конфигурации системы журналирования, где хранятся параметры этого обработчика.
Сигнатура:
def get_config_section (self) -> str:
pass
Параметры: Нет.
Возвращаемое значение:
- str: Название секции.
handle
Задаёт контракт для всех обработчиков, отвечающих за вывод логов (в файл, консоль, очередь и т.п.).
Сигнатура:
def handle (self, level: int, message: str, context: dict | None = None) -> None:
pass
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
| level | int | Уровень сообщения (например, DEBUG, INFO, WARNING, ERROR). Используется для категоризации и фильтрации логов. |
| message | str | Основной текст сообщения лога. Должен быть читаемым и информативным. |
| context | dict[str,Any] | None | Необязательный словарь с дополнительной контекстной информацией (например, идентификатор пользователя, время операции, параметры запроса). Если контекст не указан, значение равно None. |
Возвращаемое значение: None
Метод выполняет:
- Получение отформатированного сообщения через текущий форматтер (get_formatter()).
- Вывод результата в целевую систему (файл, консоль и т. д.) согласно настройкам конфигурации.
destroy
Уничтожение объекта обработчика.
Сигнатура:
def destroy (self) -> None:
pass
Параметры: Нет.
Возвращаемое значение: Нет.
Примеры использования
Пример 1: Простая реализация (вывод в консоль)
# anb_python_components/log_handlers/console_handler.py
from typing import Any
from anb_python_components.enums.message_type import MessageType
from anb_python_components.extensions.array_extension import ArrayExtension
from anb_python_components.protocols import ILogFormatter, ILogHandler
class ConsoleHandler(ILogHandler):
"""
Обработчик системы журналирования для вывода в консоль.
Настройки должны находится в секции `console_handler`. Принимаются следующие настройки:
- color - dict[MessageType, str] - цвет вывода по уровню.
@example Пример настроек:
{
'color': {
MessageType.DEBUG: '\033[36m',
MessageType.INFO: '\033[32m',
MessageType.SUCCESS: '\033[32m',
MessageType.WARNING: '\033[33m',
MessageType.STOP: '\033[31m',
MessageType.CRITICAL: '\033[31m',
MessageType.ERROR: '\033[31m',
MessageType.NOLOG: '\033[36m'
}
}
"""
def __init__ (self) -> None:
"""
Конструктор класса.
"""
# Обработчик сообщений (форматер)
self.__formatter: ILogFormatter | None = None
# Цвета вывода по уровню.
self.__color: dict[MessageType, str] = {}
def __get_color (self, level: int, color: dict[MessageType, Any] | None = None) -> str:
"""
Получение цвета из конфига или цвета по умолчанию.
:param level: Уровень сообщения.
:param color: Словарь с цветами или None для получения их системной конфигурации.
:return: Текстовое представление уровня сообщения.
"""
# Задаю цвета по умолчанию
default_colors = {
MessageType.DEBUG: '\033[36m',
MessageType.INFO: '\033[32m',
MessageType.SUCCESS: '\033[32m',
MessageType.WARNING: '\033[33m',
MessageType.STOP: '\033[31m',
MessageType.CRITICAL: '\033[31m',
MessageType.ERROR: '\033[31m',
MessageType.NOLOG: '\033[36m'
}
# Если передан словарь цветов, то беру его, если нет, то получаем из настойки
from_color = color if color is not None else self.__color
# Перевожу уровень в MessageType
level = MessageType.from_int(level)
# Если не удалось перевести level к типу MessageType
if isinstance(level, int):
# - то будет выведено сообщение без формата
level = MessageType.NOLOG
# Возвращаю значение
return ArrayExtension.get_dictionary_value(
from_color,
(level,),
ArrayExtension.get_dictionary_value(default_colors, (level,), '\033[36m')
)
def set_color_scheme (self, color: dict[MessageType, Any]) -> None:
"""
Устанавливает цвета вывода по уровню.
:param color: Цвета вывода по уровню.
:return: None
"""
# Задаю цвета в поддерживаемый массив
self.__color = {
MessageType.DEBUG: self.__get_color(MessageType.DEBUG.value, color),
MessageType.INFO: self.__get_color(MessageType.INFO.value, color),
MessageType.SUCCESS: self.__get_color(MessageType.SUCCESS.value, color),
MessageType.WARNING: self.__get_color(MessageType.WARNING.value, color),
MessageType.STOP: self.__get_color(MessageType.STOP.value, color),
MessageType.CRITICAL: self.__get_color(MessageType.CRITICAL.value, color),
MessageType.ERROR: self.__get_color(MessageType.ERROR.value, color),
MessageType.NOLOG: self.__get_color(MessageType.NOLOG.value, color)
}
def get_formatter (self) -> ILogFormatter:
"""
Возвращает текущий форматер.
:return: Текущее значение форматера.
"""
# Если обработчик ещё не создан
if self.__formatter is None:
# - вызываем исключение
raise ValueError("Форматтер не задан")
# Возвращаем обработчик
return self.__formatter
def set_formatter (self, formatter: ILogFormatter) -> None:
"""
Устанавливает обработчик сообщений (форматтер).
:param formatter: Обработчик сообщений.
:return: None
"""
self.__formatter = formatter
def get_config_section (self) -> str:
"""
Возвращает название секции в конфигурации системы журналирования, где хранятся параметры этого обработчика.
:return: Название секции.
"""
return 'console_handler'
def set_config (self, config: dict[str, Any]) -> None:
"""
Устанавливает настройки системы журналирования.
:param config: Словарь настроек.
:return: None
"""
# Устанавливаю цвет
self.set_color_scheme(ArrayExtension.get_dictionary_value(config, ('color',), {}))
def handle (self, level: int, message: str, context: dict | None = None) -> None:
"""
Задаёт контракт для всех обработчиков, отвечающих за вывод логов (в файл, консоль, очередь и т.п.).
:param level: Уровень сообщения.
:param message: Текст сообщения.
:param context: Контекст сообщения или None.
:return: None
"""
# Получаю текущий цвет
color = self.__get_color(level)
# Добавляю ссылку на новую строку
reset = "\033[0m"
# Получаю строку
formatted = self.__formatter.format_message(level, message, context)
# Преобразую её для консоли
log_line = f"{color}{formatted}{reset}\n"
# Вывожу строку
print(log_line)
def destroy (self) -> None:
"""
Уничтожение объекта обработчика.
:return: None.
"""
pass
Пример 2: Реализация для записи в файл
# anb_python_components/log_handlers/file_handler.py
from typing import Any
from anb_python_components.extensions.array_extension import ArrayExtension
from anb_python_components.protocols import ILogFormatter, ILogHandler
class FileHandler(ILogHandler):
"""
Обработчик системы журналирования для вывода в файл.
Настройки должны находится в секции `file_handler`. Принимаются следующие настройки:
- file - str - имя файла журнала.
@example Пример настроек:
{'file': 'c:/logs/my_log.log'}
"""
def __init__ (self) -> None:
"""
Конструктор класса.
"""
# Обработчик сообщений (форматер)
self.__formatter: ILogFormatter | None = None
# Путь к файлу журналов
self.__log_file: str = ""
def set_file (self, log_file: str) -> None:
"""
Устанавливает путь до файла журнала.
:param log_file: Полный путь к файлу журнала.
:return: None
"""
self.__log_file = log_file
def set_formatter (self, formatter: ILogFormatter) -> None:
"""
Устанавливает обработчик сообщений (форматтер).
:param formatter: Обработчик сообщений.
:return: None
"""
self.__formatter = formatter
def get_formatter (self) -> ILogFormatter:
"""
Возвращает текущий форматер.
:return: Текущее значение форматера.
"""
return self.__formatter
def get_config_section (self) -> str:
"""
Возвращает название секции в конфигурации системы журналирования, где хранятся параметры этого обработчика.
:return: Название секции.
"""
return 'file_handler'
def set_config (self, config: dict[str, Any]) -> None:
"""
Устанавливает настройки системы журналирования.
:param config: Словарь настроек.
:return: None
"""
# Получаем полный путь к файлу журнала из конфигурации
log_file = ArrayExtension.get_dictionary_value(config, ('file',), 'log.txt')
# Устанавливаю имя файла журнала
self.set_file(log_file)
def handle (self, level: int, message: str, context: dict | None = None) -> None:
"""
Задаёт контракт для всех обработчиков, отвечающих за вывод логов (в файл, консоль, очередь и т.п.).
:param level: Уровень сообщения.
:param message: Текст сообщения.
:param context: Контекст сообщения или None.
:return: None
"""
# Получаю форматированную строку
formatted = self.__formatter.format_message(level, message, context)
# Создаю запись для журнала
log_line = f"{formatted}\n"
# Отправляю в файл
try:
with open(self.__log_file, 'a', encoding='utf-8') as file:
file.write(log_line + '\n')
except IOError as e:
print(f"Ошибка записи в лог: {e}")
def destroy (self) -> None:
"""
Уничтожение объекта обработчика.
:return: None.
"""
pass
Сценарии применения
Реализация ILogHandler полезна в следующих случаях:
- Вывод логов в консоль для отладки и мониторинга в режиме реального времени.
- Запись логов в файл для долгосрочного хранения и анализа.
- Отправка логов в централизованную систему (например, ELK Stack, Graylog) через сетевые протоколы.
- Интеграция с очередями сообщений (RabbitMQ, Kafka) для асинхронной обработки логов.
- Фильтрация по уровням (DEBUG, ERROR) перед выводом.
- Динамическая смена форматтера во время выполнения (например, переключение с текстового формата на JSON).
- Гибкая настройка параметров логирования через конфигурационные файлы или переменные окружения.