48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
import logging
|
|
import sys
|
|
from loguru import logger as guru_logger
|
|
|
|
|
|
def register_logger():
|
|
print("📢 Setting up logging interception...")
|
|
|
|
# 🔴 **Ensure Uvicorn Logs Are Captured**
|
|
intercept_loggers = ["uvicorn", "uvicorn.access", "uvicorn.error", "fastapi"]
|
|
|
|
class InterceptHandler(logging.Handler):
|
|
def emit(self, record):
|
|
level = (
|
|
guru_logger.level(record.levelname).name
|
|
if guru_logger.level(record.levelname, None)
|
|
else record.levelno
|
|
)
|
|
frame, depth = logging.currentframe(), 2
|
|
while frame.f_code.co_filename == logging.__file__:
|
|
frame = frame.f_back
|
|
depth += 1
|
|
|
|
guru_logger.opt(depth=depth, exception=record.exc_info).log(
|
|
level,
|
|
f"[{record.name}] {record.getMessage()}",
|
|
)
|
|
|
|
# 🔴 **Replace Existing Loggers with Interception**
|
|
logging.root.handlers.clear()
|
|
logging.root.setLevel(logging.INFO)
|
|
logging.root.handlers = [InterceptHandler()]
|
|
|
|
for logger_name in intercept_loggers:
|
|
logging_logger = logging.getLogger(logger_name)
|
|
logging_logger.handlers.clear() # Remove Uvicorn default handlers
|
|
logging_logger.propagate = True # ✅ Ensure they propagate through Loguru
|
|
|
|
# 🔴 **Redirect stdout/stderr to Loguru (Keep Green Timestamps)**
|
|
guru_logger.remove()
|
|
guru_logger.add(
|
|
sys.stdout,
|
|
level="INFO",
|
|
format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | {level} | {message}",
|
|
)
|
|
|
|
print("✅ Logging interception complete. Logs are formatted and deduplicated!")
|