visual-search-api / src /core /logging.py
AdarshDRC's picture
test2
3341f00
import asyncio
import json
from src.core.config import SUPABASE_URL, SUPABASE_SERVICE_KEY
from loguru import logger as _loguru
_http_session = None
#Removing the Default Loging Template
_loguru.remove()
#Adding the Custom Loging Template
_loguru.add(
lambda msg: print(msg, end=""),
format="<green>{time:HH:mm:ss}</green> | <level>{level:<8}</level> | {message}",
level="DEBUG",
colorize=True,
)
_log_fn = _loguru.log
# A coroutine to initialize the HTTP session
async def init_logging_session():
global _http_session
if SUPABASE_URL and SUPABASE_SERVICE_KEY:
import aiohttp
_http_session = aiohttp.ClientSession(
headers={
"Content-Type": "application/json",
"apikey": SUPABASE_SERVICE_KEY,
"Authorization": f"Bearer {SUPABASE_SERVICE_KEY}",
"Prefer": "return=minimal",
}
)
# Coroutine to close the HTTP session
async def close_logging_session():
global _http_session
if _http_session:
await _http_session.close()
async def _supabase_log(level: str, event: str, data: dict) -> None:
if not _http_session:
return
try:
import aiohttp
row = {
"level": level.upper(),
"event": event,
"user_id": str(data.get("user_id", "anonymous")),
"ip": str(data.get("ip", "")),
"mode": str(data.get("mode", "")),
"page": str(data.get("page", "")),
"duration_ms": int(data["duration_ms"]) if "duration_ms" in data else None,
"error": str(data["error"]) if "error" in data else None,
"data": data,
}
async with _http_session.post(
f"{SUPABASE_URL}/rest/v1/app_logs",
json=row,
timeout=aiohttp.ClientTimeout(total=5),
) as r:
if r.status not in (200, 201):
body = await r.text()
_log_fn("WARNING", f"Supabase log failed {r.status}: {body[:200]}")
except Exception as exc:
_log_fn("DEBUG", f"Supabase log push skipped: {exc}")
_LEVEL_ALIASES = {"WARN": "WARNING", "ERR": "ERROR", "FATAL": "CRITICAL"}
def log(level: str, event: str, **data) -> None:
norm_level = _LEVEL_ALIASES.get(level.upper(), level.upper())
_log_fn(norm_level, f"[{event}] {json.dumps(data, default=str)}")
try:
loop = asyncio.get_running_loop()
loop.create_task(_supabase_log(norm_level, event, data))
except RuntimeError:
pass
def warn(msg: str) -> None:
_log_fn("WARNING", msg)