diff --git a/.gitignore b/.gitignore index debcc77..7bd923a 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ logs/ *.log metrics.log + # ============================================================================== # Файлы IDE и редакторов # У каждого разработчика могут быть свои настройки. diff --git a/app/core/logging.py b/app/core/logging.py index f96ef86..d517994 100644 --- a/app/core/logging.py +++ b/app/core/logging.py @@ -1,29 +1,70 @@ import sys +from pathlib import Path from loguru import logger from .config import settings def setup_logging(): """ - Настраивает Loguru для вывода в консоль и в файл с ротацией. + Настройка Loguru: + - Раздельные потоки INFO/ERROR в консоли. + - Ротируемые файлы для всех логов и только для ошибок. + - JSON-формат для интеграций. """ - logger.remove() # удаляем стандартный обработчик + logger.remove() # Удаляем стандартный обработчик - # Настраиваем логирование в консоль (stderr) с цветом + # Создаём папку для логов, если её нет + 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=settings.LOG_LEVEL.upper(), - format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {message}", + level="ERROR", + format="{time:YYYY-MM-DD HH:mm:ss} | {level:<8} | {message}", colorize=True ) - # Настраиваем логирование в файл + # 3. Файл для ВСЕХ логов logger.add( - "metrics.log", # Имя файла + "logs/metrics.log", level=settings.LOG_LEVEL.upper(), - format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function} - {message}", - rotation="1 MB", # Ротация, когда файл достигнет 1 MB - compression="zip", # Сжимать старые файлы логов в zip - enqueue=True, # Делает запись безопасной для многопоточности - backtrace=True, # Показывает полный стектрейс при ошибках - diagnose=True # Добавляет полезную информацию для отладки ошибок + 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 ) \ No newline at end of file