feat: intercept standard logging messages
This commit is contained in:
parent
78f29fc9f6
commit
dd33a8ef9c
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user