日志统一
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user