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