import logging import logging.handlers import sys from config import LABEL class LogFormatter(logging.Formatter): """Custom `logging` formatter.""" def __init__(self): super().__init__() self.__label = f"{LABEL}" self._set_messages_views() def _set_messages_views(self): msg_debug = f"{self.__label} %(name)s.%(funcName)s:%(lineno)d: %(message)s" msg_info = f"{self.__label} %(message)s" msg_warn = f"{self.__label} %(message)s" msg_error = f"{self.__label} %(message)s" msg_critical = f"{self.__label} %(message)s" self._format_lookup = { logging.DEBUG: msg_debug, logging.INFO: msg_info, logging.WARN: msg_warn, logging.ERROR: msg_error, logging.CRITICAL: msg_critical, } def format(self, record: logging.LogRecord): orig_format = self._style._fmt try: self._style._fmt = self._format_lookup.get(record.levelno, orig_format) return super().format(record) finally: self._style._fmt = orig_format def init_logging() -> None: """Initializes logging facility. Args: loglevel: one of the predefined loglevels. """ stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setFormatter(LogFormatter()) logging.root.addHandler(stream_handler) logging.captureWarnings(True) def set_log_level(loglevel: str) -> None: """Sets logging level. Args: loglevel: one of the predefined loglevels. """ logging.getLogger(__package__).setLevel(loglevel.upper()) # root logger for the package