Skip to content

Logging#

loggers #

get_logger #

get_logger(name: str, level: str = 'INFO') -> structlog.stdlib.BoundLogger

Retrieve a logger with the specified log level.

Parameters:

Name Type Description Default

name #

str

Name of Logger Instance

required

level #

str

Desired logging level.

'INFO'

Returns:

Type Description
logging.Logger

Configured logger instance.

Source code in src/imgnet/loggers/__init__.py
def get_logger(name: str, level: str = "INFO") -> structlog.stdlib.BoundLogger:
    """
    Retrieve a logger with the specified log level.

    Parameters
    ----------
    name : str
        Name of Logger Instance
    level : str
        Desired logging level.

    Returns
    -------
    logging.Logger
        Configured logger instance.
    """
    logging_manager = LoggingManager(name)
    env_level = logging_manager.env_level

    if env_level not in (level, DEFAULT_LOG_LEVEL):
        logging_manager.get_logger().warning(
            f"Environment variable {name}_LOG_LEVEL is {env_level} "
            f"but you are setting it to {level}"
        )
    return logging_manager.configure_logging(level=level)

temporary_log_level #

temporary_log_level(logger: structlog.stdlib.BoundLogger, level: str) -> typing.Generator[None, typing.Any, None]

Temporarily change the log level of a logger within a context.

Parameters:

Name Type Description Default

logger #

structlog.stdlib.BoundLogger

The logger instance to modify

required

level #

str

The temporary log level to set

required

Examples:

>>> with temporary_log_level(logger, "ERROR"):
...     # Only ERROR and CRITICAL messages will be logged in this block
...     logger.warning("This won't be logged")
...     logger.error("This will be logged")
Source code in src/imgnet/loggers/__init__.py
@contextmanager
def temporary_log_level(
    logger: structlog.stdlib.BoundLogger, level: str
) -> Generator[None, Any, None]:
    """
    Temporarily change the log level of a logger within a context.

    Parameters
    ----------
    logger : structlog.stdlib.BoundLogger
        The logger instance to modify
    level : str
        The temporary log level to set
    Examples
    --------
    >>> with temporary_log_level(logger, "ERROR"):
    ...     # Only ERROR and CRITICAL messages will be logged in this block
    ...     logger.warning("This won't be logged")
    ...     logger.error("This will be logged")
    """
    import logging

    original_level = logger.level
    logger.setLevel(getattr(logging, level.upper()))
    try:
        yield
    finally:
        logger.setLevel(original_level)

tqdm_logging_redirect #

tqdm_logging_redirect(logger_name: str = 'imgnet') -> contextlib.AbstractContextManager[None]

Context manager to redirect logging output into tqdm for cleaner logging.

Parameters:

Name Type Description Default

logger_name #

str

The name of the logger to redirect, by default "imgnet".

'imgnet'

Examples:

>>> from tqdm import tqdm
>>> import time
>>> with tqdm_logging_redirect():
...     for i in tqdm(range(10), desc="Processing"):
...         logger.info(f"Processing {i}")
...         time.sleep(0.1)
Source code in src/imgnet/loggers/__init__.py
def tqdm_logging_redirect(
    logger_name: str = "imgnet",
) -> AbstractContextManager[None]:
    """Context manager to redirect logging output into tqdm for cleaner logging.

    Parameters
    ----------
    logger_name : str, optional
        The name of the logger to redirect, by default "imgnet".

    Examples
    --------
    >>> from tqdm import tqdm
    >>> import time
    >>> with tqdm_logging_redirect():
    ...     for i in tqdm(range(10), desc="Processing"):
    ...         logger.info(f"Processing {i}")
    ...         time.sleep(0.1)
    """
    import logging

    return _redirect_tqdm([logging.getLogger(logger_name)])