From dd33a8ef9c18597dc36448823c79c94d9aeb4f52 Mon Sep 17 00:00:00 2001 From: BoYanZh Date: Thu, 13 Jul 2023 03:35:27 +0800 Subject: [PATCH] feat: intercept standard logging messages --- joint_teapot/utils/logger.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/joint_teapot/utils/logger.py b/joint_teapot/utils/logger.py index d489f3c..91f33f9 100644 --- a/joint_teapot/utils/logger.py +++ b/joint_teapot/utils/logger.py @@ -1,11 +1,36 @@ +import logging +import sys from sys import stderr +from types import FrameType +from typing import Optional from loguru import logger as logger 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: + logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True) logger.remove() logger.add(stderr, level=stderr_log_level) logger.add(settings.log_file_path, level="DEBUG")