class_desc/protocols


Интерфейс ILogFormatter

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

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

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

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

Метод интерфейса

format_message

Форматирует сообщение по заданному правилу.

Сигнатура:

def format_message (self, level: int, message: str, context: dict | None = None) -> str:
    pass

Параметры:

Параметры Тип Описание
level int Уровень сообщения (например, DEBUG, INFO, WARNING, ERROR). Используется для категоризации и фильтрации логов, может влиять на визуальное оформление (цвет, префикс)
message str Основной текст сообщения лога. Должен быть читаемым и информативным, описывающим событие или ошибку
context dict[str, Any]|None Необязательный словарь с дополнительной контекстной информацией (например, идентификатор пользователя, время операции, параметры запроса). Если контекст не указан, значение равно None

Возвращаемое значение: str: Отформатированная строка, готовая к выводу в поток логов (файл, консоль, сеть и т.д.). Формат строки определяется реализацией протокола. Примеры:

Простой текст: [2024-04-12 10:00:00] ERROR: Не удалось подключиться к БД
JSON: {"timestamp": "2024-04-12T10:00:00", "level": "ERROR", "message": "Не удалось подключиться", "context": {"
db_host": "localhost"}}

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

Пример 1: Простая реализация (текстовый формат)

from datetime import datetime

class SimpleLogFormatter:
    
    def format_message (self, level: int, message: str, context: dict | None = None) -> str:
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        
        match level:
            case 0:
                level_name = 'ОТЛАДКА'
            case 10:
                level_name = 'ИНФОРМАЦИЯ'
            case 11:
                level_name = 'УСПЕХ',
            case 20:
                level_name = 'ПРЕДУПРЕЖДЕНИЕ',
            case 30:
                level_name = 'ОСТАНОВКА ВЫПОЛНЕНИЯ',
            case 31:
                level_name = 'КРИТИЧЕСКАЯ ОШИБКА',
            case 39:
                level_name = 'ОШИБКА',
            case 100:
                level_name = 'ЖУРНАЛИРОВАНИЕ НЕ ВЕДЁТСЯ'
            case _:
                level_name = ''
        if context:
            context_str = f" | Контекст: {context}"
        else:
            context_str = ""
        
        return f"[{timestamp}] {level_name}: {message}{context_str}"

Пример 2: Реализация для JSON‑логов

import json
from datetime import datetime

class JsonLogFormatter:
    
    def format_message (self, level: int, message: str, context: dict | None = None) -> str:
        log_entry = {
                "timestamp": datetime.now().isoformat(),
                "level": level.value,
                "message": message
                }
        if context:
            log_entry["context"] = context
        
        return json.dumps(log_entry, ensure_ascii = False)

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

Реализация ILogFormatter полезна в следующих случаях:

  • Форматирование в простой текстовый вид для вывода в консоль или файл.
  • Генерация JSON‑записей для централизованного сбора логов (например, в ELK Stack).
  • Добавление временных меток, идентификаторов запросов или метаданных среды.
  • Цветовое выделение уровней логов в консольном выводе (с использованием ANSI‑кодов).
  • Адаптация формата под требования внешних систем мониторинга и анализа логов.

На главную