Source code for infrahouse_core.logging

"""
InfraHouse Toolkit Logging.
"""

import logging
import sys
from typing import Optional


[docs] class LessThanFilter(logging.Filter): # pylint: disable=too-few-public-methods """Filters out log messages of a lower level.""" def __init__(self, exclusive_maximum, name=""): super().__init__(name) self.max_level = exclusive_maximum
[docs] def filter(self, record): # non-zero return means we log this message return 1 if record.levelno < self.max_level else 0
[docs] def setup_logging( # pragma: no cover logger: Optional[logging.Logger] = None, debug: bool = False, quiet: bool = False, debug_botocore: bool = False, ) -> None: """ Configure logging for the module. Sets up stdout/stderr handlers with level-based routing. The logger is configured in place and nothing is returned. :param logger: Logger to configure. If ``None``, uses the root logger. :type logger: logging.Logger or None :param debug: Enable debug logging. :type debug: bool :param quiet: Suppress INFO logs. :type quiet: bool :param debug_botocore: If True, keep botocore at debug level instead of suppressing it. :type debug_botocore: bool """ logger = logger or logging.getLogger() fmt_str = "%(asctime)s: %(levelname)s: %(name)s:%(module)s.%(funcName)s():%(lineno)d: %(message)s" console_handler = logging.StreamHandler(stream=sys.stdout) console_handler.addFilter(LessThanFilter(logging.WARNING)) console_handler.setLevel(logging.ERROR if quiet else logging.INFO) console_handler.setFormatter(logging.Formatter(fmt_str)) # Log errors and warnings to stderr console_handler_err = logging.StreamHandler(stream=sys.stderr) console_handler_err.setLevel(logging.ERROR if quiet else logging.WARNING) console_handler_err.setFormatter(logging.Formatter(fmt_str)) # Log debug to stderr console_handler_debug = logging.StreamHandler(stream=sys.stderr) console_handler_debug.addFilter(LessThanFilter(logging.INFO)) console_handler_debug.setLevel(logging.DEBUG) console_handler_debug.setFormatter(logging.Formatter(fmt_str)) logger.handlers = [] logger.addHandler(console_handler) logger.addHandler(console_handler_err) if debug: logger.addHandler(console_handler_debug) logger.debug_enabled = True logger.setLevel(logging.DEBUG) # botocore prints a lot of logs at INFO and WARNING level that deserve to be only DEBUG. botocore_level = logging.DEBUG if debug_botocore else logging.WARNING logging.getLogger("botocore").setLevel(botocore_level if debug else logging.ERROR)