26 lines
791 B
Python
26 lines
791 B
Python
|
|
import logging
|
||
|
|
from types import FrameType
|
||
|
|
from typing import cast
|
||
|
|
|
||
|
|
from loguru import logger
|
||
|
|
|
||
|
|
|
||
|
|
class InterceptHandler(logging.Handler):
|
||
|
|
def emit(self, record: logging.LogRecord) -> None: # pragma: no cover
|
||
|
|
# Get corresponding Loguru level if it exists
|
||
|
|
try:
|
||
|
|
level = logger.level(record.levelname).name
|
||
|
|
except ValueError:
|
||
|
|
level = str(record.levelno)
|
||
|
|
|
||
|
|
# Find caller from where originated the logged message
|
||
|
|
frame, depth = logging.currentframe(), 2
|
||
|
|
while frame.f_code.co_filename == logging.__file__: # noqa: WPS609
|
||
|
|
frame = cast(FrameType, frame.f_back)
|
||
|
|
depth += 1
|
||
|
|
|
||
|
|
logger.opt(depth=depth, exception=record.exc_info).log(
|
||
|
|
level,
|
||
|
|
record.getMessage(),
|
||
|
|
)
|