Source code for search_names.logging_config
"""Logging configuration for search_names package."""
import logging
from rich.console import Console
from rich.logging import RichHandler
[docs]
def setup_logging(
level: str = "INFO",
rich_tracebacks: bool = True,
show_time: bool = True,
show_path: bool = False,
) -> logging.Logger:
"""Set up logging with rich formatting.
Args:
level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
rich_tracebacks: Whether to use rich formatted tracebacks
show_time: Whether to show timestamps
show_path: Whether to show file paths in logs
Returns:
Configured logger instance
"""
# Convert string level to logging constant
numeric_level = getattr(logging, level.upper(), logging.INFO)
# Create console for rich output
console = Console(stderr=True)
# Configure rich handler
rich_handler = RichHandler(
console=console,
show_time=show_time,
show_path=show_path,
rich_tracebacks=rich_tracebacks,
markup=True,
)
# Set format
rich_handler.setFormatter(
logging.Formatter(
fmt="%(message)s",
datefmt="[%X]",
)
)
# Configure root logger
logger = logging.getLogger("search_names")
logger.setLevel(numeric_level)
# Remove existing handlers to avoid duplicates
for handler in logger.handlers[:]:
logger.removeHandler(handler)
# Add rich handler
logger.addHandler(rich_handler)
# Prevent propagation to root logger to avoid duplicate messages
logger.propagate = False
return logger
[docs]
def get_logger(name: str | None = None) -> logging.Logger:
"""Get a logger instance.
Args:
name: Optional logger name. If None, returns the main package logger.
Returns:
Logger instance
"""
if name is None:
return logging.getLogger("search_names")
return logging.getLogger(f"search_names.{name}")