Update central storage log config

This commit is contained in:
Jet Li 2025-02-01 05:59:00 +00:00
parent 8cae70a21f
commit a33869b7fe
2 changed files with 40 additions and 46 deletions

View File

@ -3,7 +3,7 @@ from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi from fastapi.openapi.utils import get_openapi
from webapi.providers import common 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 router
from webapi.providers import database from webapi.providers import database
from webapi.providers import scheduler from webapi.providers import scheduler
@ -16,9 +16,9 @@ def create_app() -> FastAPI:
app = FreeleapsApp() app = FreeleapsApp()
register_logger()
register(app, exception_handler) register(app, exception_handler)
register(app, database) register(app, database)
register(app, logger)
register(app, router) register(app, router)
register(app, scheduler) register(app, scheduler)
register(app, common) register(app, common)

View File

@ -1,53 +1,47 @@
import logging import logging
import sys import sys
from loguru import logger from loguru import logger as guru_logger
from common.config.log_settings import log_settings
def register(app=None): def register_logger():
level = log_settings.LOG_LEVEL print("📢 Setting up logging interception...")
file_path = log_settings.LOG_PATH
retention = log_settings.LOG_RETENTION
rotation = log_settings.LOG_ROTATION
# 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.handlers = [InterceptHandler()]
logging.root.setLevel(level)
# remove every other logger's handlers for logger_name in intercept_loggers:
# and propagate to root logger logging_logger = logging.getLogger(logger_name)
for name in logging.root.manager.loggerDict.keys(): logging_logger.handlers.clear() # Remove Uvicorn default handlers
logging.getLogger(name).handlers = [] logging_logger.propagate = True # ✅ Ensure they propagate through Loguru
logging.getLogger(name).propagate = True
# configure loguru # 🔴 **Redirect stdout/stderr to Loguru (Keep Green Timestamps)**
logger.add(sink=sys.stdout) guru_logger.remove()
logger.add(sink=file_path, level=level, retention=retention, rotation=rotation) guru_logger.add(
sys.stdout,
level="INFO",
format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | {level} | {message}",
)
logger.disable("pika.adapters") print("✅ Logging interception complete. Logs are formatted and deduplicated!")
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()
)