Skip to content

log

dev_tool.log

logger

A context manager for setting up and tearing down logging.

This context manager configures file and console logging handlers.

:yield: None

Source code in dev_tool/log.py
@contextmanager
def logger() -> Generator[None, Any, None]:
    """
    A context manager for setting up and tearing down logging.

    This context manager configures file and console logging handlers.

    :yield: None
    """

    try:
        log = logging.getLogger()
        log.setLevel(logging.DEBUG)

        loggers = [
            'httpx',
            'httpcore.connection',
            'httpcore.http11',
            'httpcore.http2',
            'urllib3'
        ]

        for logger_name in loggers:
            logging.getLogger(logger_name).setLevel(logging.WARNING)

        path = STRATUS / 'stratus.log'
        path.touch(exist_ok=True)

        file_handler = RotatingFileHandler(
            filename=path,
            encoding='utf-8',
            maxBytes=10 * 1024 * 1024,
            backupCount=5
        )

        stream_handler = logging.StreamHandler()

        color_formatter = colorlog.ColoredFormatter(
            fmt='{log_color}[{asctime}] [{levelname}] {name}: {message}',
            datefmt='%Y-%m-%d %I:%M:%S %p',
            style='{',
            log_colors={
                'DEBUG': 'cyan',
                'INFO': 'green',
                'WARNING': 'yellow',
                'ERROR': 'red',
                'CRITICAL': 'bold_red',
            },
        )

        formatter = logging.Formatter(
            '[{asctime}] [{levelname}] {name}: {message}',
            '%Y-%m-%d %I:%M:%S %p',
            style='{',
        )

        file_handler.setFormatter(formatter)
        file_handler.setLevel(logging.DEBUG)

        stream_handler.setFormatter(color_formatter)
        stream_handler.setLevel(logging.CRITICAL)

        log.addHandler(file_handler)
        log.addHandler(stream_handler)

        log.propagate = False

        yield
    finally:
        for handler in log.handlers:
            handler.close()
            log.removeHandler(handler)