diff --git a/app/core/logger.py b/app/core/logger.py index 8110b17..46e0a00 100644 --- a/app/core/logger.py +++ b/app/core/logger.py @@ -1,3 +1,4 @@ +import logging import os import sys @@ -67,4 +68,29 @@ def _setup_logger() -> logger.__class__: return logger +class _InterceptHandler(logging.Handler): + """将标准 logging 的日志转发到 Loguru""" + + def emit(self, record: logging.LogRecord) -> None: + try: + level = logger.level(record.levelname).name + except ValueError: + level = record.levelno + frame, depth = logging.currentframe(), 0 + while frame and (depth == 0 or 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()) + + +def _intercept_stdlib_logging() -> None: + """拦截 SQLAlchemy、uvicorn 等标准 logging 输出,统一到 Loguru""" + intercept = _InterceptHandler() + for name in ("sqlalchemy.engine", "uvicorn", "uvicorn.access", "uvicorn.error"): + stdlib_logger = logging.getLogger(name) + stdlib_logger.handlers = [intercept] + stdlib_logger.propagate = False + + log = _setup_logger() +_intercept_stdlib_logging()