import sys from pathlib import Path from loguru import logger from .config import settings def setup_logging(): """ Настройка Loguru: - Раздельные потоки INFO/ERROR в консоли. - Ротируемые файлы для всех логов и только для ошибок. - JSON-формат для интеграций. """ logger.remove() # Удаляем стандартный обработчик # Создаём папку для логов, если её нет Path("logs").mkdir(exist_ok=True) # 1. Консоль: INFO и ниже -> stdout (стандартный вывод) logger.add( sys.stdout, level="INFO", format="{time:YYYY-MM-DD HH:mm:ss} | {level:<8} | {message}", colorize=True, filter=lambda record: record["level"].no < 40 # Все уровни ниже ERROR ) # 2. Консоль: ERROR и выше -> stderr (поток ошибок) logger.add( sys.stderr, level="ERROR", format="{time:YYYY-MM-DD HH:mm:ss} | {level:<8} | {message}", colorize=True ) # 3. Файл для ВСЕХ логов logger.add( "logs/metrics.log", level=settings.LOG_LEVEL.upper(), format="{time:YYYY-MM-DD HH:mm:ss} | {level:<8} | {name}:{function} - {message}", rotation="10 MB", # Ротация при достижении 10 MB retention="30 days", # Хранить файлы 30 дней compression="zip", enqueue=True, backtrace=True, diagnose=True ) # 4. Отдельный файл ТОЛЬКО для ошибок logger.add( "logs/errors.log", level="ERROR", format="{time:YYYY-MM-DD HH:mm:ss} | {level:<8} | {name}:{function} - {message}", rotation="5 MB", retention="60 days", # Ошибки храним дольше compression="zip", enqueue=True, backtrace=True, diagnose=True ) # 5. JSON-логи для систем сбора (ELK, Grafana Loki и т.д.) logger.add( "logs/metrics.json", level=settings.LOG_LEVEL.upper(), serialize=True, # Главный параметр для JSON rotation="10 MB", retention="30 days", compression="zip", enqueue=True )