Logging Configurator

Contains LoggingConfigurator & GunicornLogger classes

LoggingConfigurator

To create a default logger

Source code in src/alpha/utils/logging_configurator.py
class LoggingConfigurator:
    """To create a default logger"""

    def __init__(
        self,
        config: dict[str, Any] | None = None,
        fmt: str = FORMAT,
        handlers: list[dict[str, Any]] | None = None,
        level: str | int = logging.INFO,
        stream: str = "stdout",
        logger_name: str = "root",
    ) -> None:
        """Initialize the LoggingConfigurator.

        Parameters
        ----------
        config
            The logging configuration dictionary, by default None
        fmt
            The logging format, by default FORMAT
        handlers
            The list of logging handlers, by default None
        level
            The logging level, by default logging.INFO
        stream
            The logging stream, by default "stdout"
        logger_name
            The name of the logger, by default 'root'
        """
        if not fmt:
            fmt = FORMAT
        if not stream:
            stream = "stdout"
        if not level:
            level = logging.INFO
        if not handlers:
            handlers = []

        logging_level = (
            getattr(logging, level.upper())
            if isinstance(level, str)
            else level
        )

        default_config: dict[str, Any] = {
            "version": 1,
            "formatters": {"default": {"format": fmt}},
            "handlers": {
                "console": {
                    "class": "logging.StreamHandler",
                    "level": logging_level,
                    "formatter": "default",
                    "stream": f"ext://sys.{stream}",
                }
            },
            logger_name: {"level": level, "handlers": ["console"]},
        }

        for ix, handler in enumerate(handlers):
            handler_name = f"handler_{ix}"
            handler_obj = LoggingHandlerFactory.parse(handler)
            default_config["handlers"].update({handler_name: handler_obj})

            default_config[logger_name]["handlers"].append(handler_name)

            handler_level = getattr(logging, handler_obj["level"])
            if handler_level < logging_level:
                logging_level = handler_level
                default_config[logger_name]["level"] = logging_level

        if config:
            dictConfig(config)
        else:
            dictConfig(default_config)

Methods:

__init__
__init__(config=None, fmt=FORMAT, handlers=None, level=logging.INFO, stream='stdout', logger_name='root')

Initialize the LoggingConfigurator.

Parameters:
  • config (dict[str, Any] | None, default: None ) –

    The logging configuration dictionary, by default None

  • fmt (str, default: FORMAT ) –

    The logging format, by default FORMAT

  • handlers (list[dict[str, Any]] | None, default: None ) –

    The list of logging handlers, by default None

  • level (str | int, default: INFO ) –

    The logging level, by default logging.INFO

  • stream (str, default: 'stdout' ) –

    The logging stream, by default "stdout"

  • logger_name (str, default: 'root' ) –

    The name of the logger, by default 'root'

Source code in src/alpha/utils/logging_configurator.py
def __init__(
    self,
    config: dict[str, Any] | None = None,
    fmt: str = FORMAT,
    handlers: list[dict[str, Any]] | None = None,
    level: str | int = logging.INFO,
    stream: str = "stdout",
    logger_name: str = "root",
) -> None:
    """Initialize the LoggingConfigurator.

    Parameters
    ----------
    config
        The logging configuration dictionary, by default None
    fmt
        The logging format, by default FORMAT
    handlers
        The list of logging handlers, by default None
    level
        The logging level, by default logging.INFO
    stream
        The logging stream, by default "stdout"
    logger_name
        The name of the logger, by default 'root'
    """
    if not fmt:
        fmt = FORMAT
    if not stream:
        stream = "stdout"
    if not level:
        level = logging.INFO
    if not handlers:
        handlers = []

    logging_level = (
        getattr(logging, level.upper())
        if isinstance(level, str)
        else level
    )

    default_config: dict[str, Any] = {
        "version": 1,
        "formatters": {"default": {"format": fmt}},
        "handlers": {
            "console": {
                "class": "logging.StreamHandler",
                "level": logging_level,
                "formatter": "default",
                "stream": f"ext://sys.{stream}",
            }
        },
        logger_name: {"level": level, "handlers": ["console"]},
    }

    for ix, handler in enumerate(handlers):
        handler_name = f"handler_{ix}"
        handler_obj = LoggingHandlerFactory.parse(handler)
        default_config["handlers"].update({handler_name: handler_obj})

        default_config[logger_name]["handlers"].append(handler_name)

        handler_level = getattr(logging, handler_obj["level"])
        if handler_level < logging_level:
            logging_level = handler_level
            default_config[logger_name]["level"] = logging_level

    if config:
        dictConfig(config)
    else:
        dictConfig(default_config)

GunicornLogger

Bases: Logger

This class overrides the default gunicorn logger.

Source code in src/alpha/utils/logging_configurator.py
class GunicornLogger(glogging.Logger):
    """This class overrides the default gunicorn logger."""

    def setup(self, cfg: Any):
        """Set the FORMAT on the gunicorn logging handler.

        Parameters
        ----------
        cfg
            The gunicorn glogging configuration
        """
        super().setup(cfg)  # type: ignore

        self._set_handler(  # type: ignore
            log=self.error_log,
            output=cfg.errorlog,
            fmt=logging.Formatter(fmt=FORMAT),
        )

Methods:

setup
setup(cfg)

Set the FORMAT on the gunicorn logging handler.

Parameters:
  • cfg (Any) –

    The gunicorn glogging configuration

Source code in src/alpha/utils/logging_configurator.py
def setup(self, cfg: Any):
    """Set the FORMAT on the gunicorn logging handler.

    Parameters
    ----------
    cfg
        The gunicorn glogging configuration
    """
    super().setup(cfg)  # type: ignore

    self._set_handler(  # type: ignore
        log=self.error_log,
        output=cfg.errorlog,
        fmt=logging.Formatter(fmt=FORMAT),
    )

Functions:

logging_level_checker

logging_level_checker(level, logger_name='root')

A simple function to check if a logging level is active.

Parameters:
  • level (str | int) –

    The logging level as a string or the corresponding integer

Returns:
  • bool

    Returns if the logging level is active

Source code in src/alpha/utils/logging_configurator.py
def logging_level_checker(level: str | int, logger_name: str = "root") -> bool:
    """A simple function to check if a logging level is active.

    Parameters
    ----------
    level
        The logging level as a string or the corresponding integer

    Returns
    -------
    bool
        Returns if the logging level is active
    """
    if isinstance(level, str):
        level_int = getattr(logging, level.upper())
    else:
        level_int = level
    return logging.getLogger(logger_name).level <= level_int