Source code for imod.logging.pythonlogger

import logging
import sys

from imod.logging.ilogger import ILogger
from imod.logging.loglevel import LogLevel


def _formatter():
    return logging.Formatter(
        "%(name)s: %(asctime)s | %(levelname)s | %(filename)s:%(lineno)s | %(process)d >>> %(message)s"
    )


def _stack_level(additional_depth: int) -> int:
    """
    The stack level is used to print the file and line number of the line being logged.
    Because there are a few layers between the place where the imod logger is used and
    the place where the pyton logger is used we need to set a custom stack level.

    An additional_depth can be provided to add to this default stack level.
    This is useful when a decorator is added which introduces an additional level between
    the imod logger and the python logger.
    """

    default_stack_level = 3
    return default_stack_level + additional_depth


[docs] class PythonLogger(ILogger): """ The :class:`PythonLogger` is used to log messages using the default python logging framework. """
[docs] def __init__( self, log_level: LogLevel, add_default_stream_handler: bool, add_default_file_handler: bool, ) -> None: self.logger = logging.getLogger("imod") self._set_level(log_level) if add_default_stream_handler: self._add_stream_handler() if add_default_file_handler: self._add_file_handler()
[docs] def debug(self, message: str, additional_depth: int = 0) -> None: self.logger.debug(message, stacklevel=_stack_level(additional_depth))
[docs] def info(self, message: str, additional_depth: int = 0) -> None: self.logger.info(message, stacklevel=_stack_level(additional_depth))
[docs] def warning(self, message: str, additional_depth: int = 0) -> None: self.logger.warning(message, stacklevel=_stack_level(additional_depth))
[docs] def error(self, message: str, additional_depth: int = 0) -> None: self.logger.error(message, stacklevel=_stack_level(additional_depth))
[docs] def critical(self, message: str, additional_depth: int = 0) -> None: self.logger.critical(message, stacklevel=_stack_level(additional_depth))
def _set_level(self, log_level: LogLevel) -> None: self.logger.setLevel(log_level.value) def _add_stream_handler(self) -> None: stdout = logging.StreamHandler(stream=sys.stdout) stdout.setFormatter(_formatter()) self.logger.addHandler(stdout) def _add_file_handler(self) -> None: file = logging.FileHandler("imod-python.log") file.setFormatter(_formatter()) self.logger.addHandler(file)