Source code for gedih3.logging_config
# Copyright (C) 2026, University of Maryland. All Rights Reserved.
# Authors: Tiago de Conto, Amelia Grace Holcomb
# For commercial licensing inquiries, contact UM Ventures at umdtechtransfer@umd.edu
"""
Logging configuration for gedih3 package.
Provides a consistent logging interface across all modules and CLI tools.
Uses Python's standard logging module with configurable levels and handlers.
Usage:
from gedih3.logging_config import get_logger
logger = get_logger(__name__)
logger.info("Processing started")
logger.debug("Detailed information")
logger.warning("Something unexpected")
logger.error("An error occurred")
"""
import logging
import sys
from typing import Optional
# Default format strings
CONSOLE_FORMAT = "%(message)s"
CONSOLE_FORMAT_VERBOSE = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
FILE_FORMAT = "%(asctime)s [%(levelname)s] %(name)s (%(filename)s:%(lineno)d): %(message)s"
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
# Package root logger name
ROOT_LOGGER_NAME = "gedih3"
# Track if logging has been configured
_logging_configured = False
[docs]
def get_logger(name: Optional[str] = None) -> logging.Logger:
"""
Get a logger for the specified module.
Parameters
----------
name : str, optional
Module name (typically __name__). If None, returns the root gedih3 logger.
Returns
-------
logging.Logger
Logger instance for the module
Examples
--------
>>> from gedih3.logging_config import get_logger
>>> logger = get_logger(__name__)
>>> logger.info("Processing started")
"""
global _logging_configured
# Auto-configure with defaults if not yet configured
if not _logging_configured:
configure_logging()
if name is None:
return logging.getLogger(ROOT_LOGGER_NAME)
# Create child logger under gedih3 namespace
if name.startswith(ROOT_LOGGER_NAME):
return logging.getLogger(name)
else:
return logging.getLogger(f"{ROOT_LOGGER_NAME}.{name}")
[docs]
def set_level(level: int) -> None:
"""
Change the logging level for all gedih3 loggers.
Parameters
----------
level : int
New logging level (logging.DEBUG, logging.INFO, etc.)
"""
logger = logging.getLogger(ROOT_LOGGER_NAME)
logger.setLevel(level)
for handler in logger.handlers:
handler.setLevel(level)
[docs]
def silence() -> None:
"""Silence all gedih3 logging output."""
set_level(logging.CRITICAL + 1)
[docs]
def enable_debug() -> None:
"""Enable debug-level logging."""
set_level(logging.DEBUG)
[docs]
class LoggingContext:
"""
Context manager for temporarily changing log level.
Examples
--------
>>> with LoggingContext(logging.DEBUG):
... # Debug logging enabled here
... pass
>>> # Original log level restored
"""
def __init__(self, level: int):
self.level = level
self.logger = logging.getLogger(ROOT_LOGGER_NAME)
self.old_level = None
[docs]
def __enter__(self):
self.old_level = self.logger.level
set_level(self.level)
return self
[docs]
def __exit__(self, exc_type, exc_val, exc_tb):
if self.old_level is not None:
set_level(self.old_level)
return False