Source code for mckit_meshes.cli.logging_setup

"""Intercept log messages from the used libraries and pass them to `loguru`.

See:
    https://github.com/Delgan/loguru
    https://github.com/Delgan/loguru/issues/474
"""

from __future__ import annotations

from typing import Final

import logging
import sys

from os import environ

from loguru import logger


[docs] class InterceptHandler(logging.Handler): """Send events from standard logging to loguru."""
[docs] def emit(self, record): # Get corresponding Loguru level if it exists try: level = logger.level(record.levelname).name except ValueError: level = record.levelno # Find caller from where originated the logged message frame, depth = logging.currentframe(), 2 while frame.f_code.co_filename == logging.__file__: # pragma: no cover frame = frame.f_back depth += 1 logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
MCKIT_CONSOLE_LOG_FORMAT: Final[str] = environ.get( "MCKIT_CONSOLE_LOG_FORMAT", default="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | " "<level>{level: <8}</level> | " "<level>{message}</level>", )
[docs] def init_logger(logfile, quiet, verbose, *, stderr_format: str = MCKIT_CONSOLE_LOG_FORMAT): log = logging.getLogger() log.addHandler(InterceptHandler()) stderr_level: str = "INFO" if quiet: stderr_level = "WARNING" elif verbose: stderr_level = "TRACE" if stderr_format: logger.add( sys.stderr, format=stderr_format, level=stderr_level, backtrace=False, diagnose=False, ) if logfile: logger.add(logfile, rotation="100 MB", level="TRACE")