70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
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
|
||
) |