Files
marquiz-metrics/app/core/logging.py

70 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level:<8}</level> | {message}",
colorize=True,
filter=lambda record: record["level"].no < 40 # Все уровни ниже ERROR
)
# 2. Консоль: ERROR и выше -> stderr (поток ошибок)
logger.add(
sys.stderr,
level="ERROR",
format="<red>{time:YYYY-MM-DD HH:mm:ss}</red> | <level>{level:<8}</level> | {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
)