My Default Logging Setup for Python Apps

(, en)
import os
import logging
from functools import cached_property
from dotenv import load_dotenv
from logging import getLogger  # noqa: F401

load_dotenv()

logger = getLogger(__name__)


class LoggingHandler:
    @cached_property
    def logger(self):
        return logging.getLogger(f"{self.__module__}.{self.__class__.__name__}")


def _get_log_level():
    loglevel = os.environ.get("LOG_LEVEL", "INFO")
    numeric_level = getattr(logging, loglevel.upper(), None)

    if not isinstance(numeric_level, int):
        raise ValueError("Invalid log level: %s" % loglevel)

    return numeric_level


def init_logging_system():
    log_dtfmt = "%Y-%m-%d %H:%M:%S"
    log_fmt = "%(asctime)s %(levelname)-5s %(name)s.%(funcName)s: %(message)s"
    log_level = _get_log_level()
    logging.addLevelName(logging.WARNING, "WARN")
    logging.basicConfig(level=log_level, format=log_fmt, datefmt=log_dtfmt)
    logger.info("logging system initiated")


init_logging_system()