日志统一
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
@@ -67,4 +68,29 @@ def _setup_logger() -> logger.__class__:
|
|||||||
return logger
|
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()
|
log = _setup_logger()
|
||||||
|
_intercept_stdlib_logging()
|
||||||
|
|||||||
Reference in New Issue
Block a user