Skip to content

logging_config

Utility functions for configuring application wide logging.

setup_logging(level='INFO', log_to_stdout=True, log_file=None)

Configure root logger for the entire application.

Called once when argparse is loaded up. Other modules should just use logging.getLogger(name).

Parameters:

Name Type Description Default
level str

Log level name, for example: "DEBUG", "INFO", "WARNING".

'INFO'
log_to_stdout bool

If True, log to stdout.

True
log_file str | None

If given, also log to this file.

None
Source code in src/mada_tools/logging_config.py
def setup_logging(
    level: str = "INFO",
    log_to_stdout: bool = True,
    log_file: str | None = None,
):
    """
    Configure root logger for the entire application.

    Called once when argparse is loaded up. Other modules
    should just use logging.getLogger(__name__).

    Args:
        level (str): Log level name, for example: "DEBUG",
            "INFO", "WARNING".
        log_to_stdout (bool): If True, log to stdout.
        log_file (str | None): If given, also log to this file.
    """
    # Convert level string to numeric value
    level_upper = level.upper()
    numeric_level = LEVEL_MAP.get(level_upper, logging.INFO)

    # Remove any existing handlers if reconfiguring
    root_logger = logging.getLogger()
    root_logger.handlers.clear()
    root_logger.setLevel(numeric_level)

    formatter = logging.Formatter(
        fmt="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )

    if log_to_stdout:
        stream_handler = logging.StreamHandler(sys.stdout)
        stream_handler.setLevel(numeric_level)
        stream_handler.setFormatter(formatter)
        root_logger.addHandler(stream_handler)

    if log_file:
        file_handler = logging.FileHandler(log_file)
        file_handler.setLevel(numeric_level)
        file_handler.setFormatter(formatter)
        root_logger.addHandler(file_handler)