feat: intercept standard logging messages

This commit is contained in:
张泊明518370910136 2023-07-13 03:35:27 +08:00
parent 78f29fc9f6
commit dd33a8ef9c
GPG Key ID: CA088E6D9284F870

View File

@ -1,11 +1,36 @@
import logging
import sys
from sys import stderr from sys import stderr
from types import FrameType
from typing import Optional
from loguru import logger as logger from loguru import logger as logger
from joint_teapot.config import settings from joint_teapot.config import settings
# recipe from https://loguru.readthedocs.io/en/stable/overview.html#entirely-compatible-with-standard-logging
class InterceptHandler(logging.Handler):
def emit(self, record: logging.LogRecord) -> None:
try:
level = logger.level(record.levelname).name
except ValueError:
level = record.levelno
# Find caller from where originated the logged message
frame: Optional[FrameType] = sys._getframe(6)
depth = 6
while frame and 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 set_logger(stderr_log_level: str = settings.stderr_log_level) -> None: def set_logger(stderr_log_level: str = settings.stderr_log_level) -> None:
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)
logger.remove() logger.remove()
logger.add(stderr, level=stderr_log_level) logger.add(stderr, level=stderr_log_level)
logger.add(settings.log_file_path, level="DEBUG") logger.add(settings.log_file_path, level="DEBUG")