Compare commits

...

3 Commits

Author SHA1 Message Date
5362e68eab Merge branch 'main' into staging
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-31 23:10:00 +01:00
c042e50267 feat(logging): Implement chetkiy logging 2025-08-31 23:05:53 +01:00
80c302278e docs: Revamp and format README.md 2025-08-31 22:42:20 +01:00
2 changed files with 55 additions and 13 deletions

1
.gitignore vendored
View File

@@ -40,6 +40,7 @@ logs/
*.log *.log
metrics.log metrics.log
# ============================================================================== # ==============================================================================
# Файлы IDE и редакторов # Файлы IDE и редакторов
# У каждого разработчика могут быть свои настройки. # У каждого разработчика могут быть свои настройки.

View File

@@ -1,29 +1,70 @@
import sys import sys
from pathlib import Path
from loguru import logger from loguru import logger
from .config import settings from .config import settings
def setup_logging(): 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="<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( logger.add(
sys.stderr, sys.stderr,
level=settings.LOG_LEVEL.upper(), level="ERROR",
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <level>{message}</level>", format="<red>{time:YYYY-MM-DD HH:mm:ss}</red> | <level>{level:<8}</level> | {message}",
colorize=True colorize=True
) )
# Настраиваем логирование в файл # 3. Файл для ВСЕХ логов
logger.add( logger.add(
"metrics.log", # Имя файла "logs/metrics.log",
level=settings.LOG_LEVEL.upper(), level=settings.LOG_LEVEL.upper(),
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function} - {message}", format="{time:YYYY-MM-DD HH:mm:ss} | {level:<8} | {name}:{function} - {message}",
rotation="1 MB", # Ротация, когда файл достигнет 1 MB rotation="10 MB", # Ротация при достижении 10 MB
compression="zip", # Сжимать старые файлы логов в zip retention="30 days", # Хранить файлы 30 дней
enqueue=True, # Делает запись безопасной для многопоточности compression="zip",
backtrace=True, # Показывает полный стектрейс при ошибках enqueue=True,
diagnose=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
) )