2022-07-14 15:17:06 +02:00
|
|
|
import logging
|
2022-12-29 18:13:19 +01:00
|
|
|
import sys
|
2023-02-18 16:21:03 +01:00
|
|
|
from typing import Any, Dict
|
2022-07-14 15:17:06 +02:00
|
|
|
|
2022-12-29 18:13:19 +01:00
|
|
|
from loguru import logger
|
2022-10-06 21:26:04 +02:00
|
|
|
|
2022-12-30 01:46:53 +01:00
|
|
|
LOGURU_FMT = "{time:%Y-%m-%dT%H:%M:%S%z} | <level>[{level: <7}]</level> [{name: <10}] [{function: <20}]: {message}"
|
2022-12-29 18:13:19 +01:00
|
|
|
|
|
|
|
|
2022-12-30 01:46:53 +01:00
|
|
|
# from loguru docs
|
|
|
|
class InterceptHandler(logging.Handler):
|
2023-02-18 12:29:25 +01:00
|
|
|
"""Intercept python logging messages and log them via loguru.logger."""
|
2022-07-14 15:17:06 +02:00
|
|
|
|
2023-02-18 16:21:03 +01:00
|
|
|
def emit(self, record: Any) -> None:
|
2022-12-30 01:46:53 +01:00
|
|
|
# Get corresponding Loguru level if it exists
|
|
|
|
try:
|
|
|
|
level = logger.level(record.levelname).name
|
|
|
|
except ValueError:
|
|
|
|
level = record.levelno
|
2022-07-15 14:04:22 +02:00
|
|
|
|
2022-12-30 01:46:53 +01:00
|
|
|
# Find caller from where originated the logged message
|
|
|
|
frame, depth = logging.currentframe(), 2
|
2023-02-18 16:21:03 +01:00
|
|
|
while frame.f_code.co_filename == logging.__file__: # pyright:ignore
|
|
|
|
frame = frame.f_back # type: ignore
|
2022-12-30 01:46:53 +01:00
|
|
|
depth += 1
|
|
|
|
|
|
|
|
logger.opt(depth=depth, exception=record.exc_info).log(
|
|
|
|
level, record.getMessage()
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# init logger with format and log level
|
|
|
|
def prepare_logger(loglevel: int = 20) -> None:
|
2023-02-18 16:21:03 +01:00
|
|
|
config: Dict[str, Any] = {
|
2022-12-29 18:13:19 +01:00
|
|
|
"handlers": [
|
|
|
|
{
|
|
|
|
"sink": sys.stdout,
|
|
|
|
"level": loglevel,
|
|
|
|
"format": LOGURU_FMT,
|
2022-12-30 01:46:53 +01:00
|
|
|
}
|
2022-12-29 18:13:19 +01:00
|
|
|
],
|
|
|
|
}
|
2022-12-30 01:46:53 +01:00
|
|
|
|
|
|
|
logging.basicConfig(handlers=[InterceptHandler()], level=loglevel)
|
2022-12-29 18:13:19 +01:00
|
|
|
logger.configure(**config)
|