From a33869b7fe271fcf92effebcd5d4d06b6d8eaa71 Mon Sep 17 00:00:00 2001 From: Jet Li Date: Sat, 1 Feb 2025 05:59:00 +0000 Subject: [PATCH] Update central storage log config --- .../webapi/bootstrap/application.py | 4 +- .../webapi/providers/logger.py | 82 +++++++++---------- 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/apps/central_storage/webapi/bootstrap/application.py b/apps/central_storage/webapi/bootstrap/application.py index 8e14dcd..8d0844d 100644 --- a/apps/central_storage/webapi/bootstrap/application.py +++ b/apps/central_storage/webapi/bootstrap/application.py @@ -3,7 +3,7 @@ from fastapi import FastAPI from fastapi.openapi.utils import get_openapi from webapi.providers import common -from webapi.providers import logger +from webapi.providers.logger import register_logger from webapi.providers import router from webapi.providers import database from webapi.providers import scheduler @@ -16,9 +16,9 @@ def create_app() -> FastAPI: app = FreeleapsApp() + register_logger() register(app, exception_handler) register(app, database) - register(app, logger) register(app, router) register(app, scheduler) register(app, common) diff --git a/apps/central_storage/webapi/providers/logger.py b/apps/central_storage/webapi/providers/logger.py index 9bc8adb..afcab10 100644 --- a/apps/central_storage/webapi/providers/logger.py +++ b/apps/central_storage/webapi/providers/logger.py @@ -1,53 +1,47 @@ import logging import sys -from loguru import logger -from common.config.log_settings import log_settings +from loguru import logger as guru_logger -def register(app=None): - level = log_settings.LOG_LEVEL - file_path = log_settings.LOG_PATH - retention = log_settings.LOG_RETENTION - rotation = log_settings.LOG_ROTATION +def register_logger(): + print("📢 Setting up logging interception...") - # intercept everything at the root logger + # 🔴 **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()] - logging.root.setLevel(level) - # remove every other logger's handlers - # and propagate to root logger - for name in logging.root.manager.loggerDict.keys(): - logging.getLogger(name).handlers = [] - logging.getLogger(name).propagate = True + 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 - # configure loguru - logger.add(sink=sys.stdout) - logger.add(sink=file_path, level=level, retention=retention, rotation=rotation) + # 🔴 **Redirect stdout/stderr to Loguru (Keep Green Timestamps)** + guru_logger.remove() + guru_logger.add( + sys.stdout, + level="INFO", + format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {message}", + ) - logger.disable("pika.adapters") - logger.disable("pika.connection") - logger.disable("pika.channel") - logger.disable("pika.callback") - logger.disable("pika.frame") - logger.disable("pika.spec") - logger.disable("aiormq.connection") - logger.disable("urllib3.connectionpool") - - -class InterceptHandler(logging.Handler): - def emit(self, record): - # Get corresponding Loguru level if it exists - try: - level = logger.level(record.levelname).name - except ValueError: - level = record.levelno - - # Find caller from where originated the logged message - frame, depth = logging.currentframe(), 2 - while frame.f_code.co_filename == logging.__file__: - frame = frame.f_back - depth += 1 - - logger.opt(depth=depth, exception=record.exc_info).log( - level, record.getMessage() - ) + print("✅ Logging interception complete. Logs are formatted and deduplicated!")