Source code for varlord.logging

"""
Logging support for varlord.

Provides configurable logging to track configuration loading,
merging, and type conversion.
"""

from __future__ import annotations

import logging
from typing import Any, Optional

# Default logger
_logger: Optional[logging.Logger] = None


[docs] def get_logger() -> logging.Logger: """Get or create the varlord logger. Returns: Logger instance for varlord. """ global _logger if _logger is None: _logger = logging.getLogger("varlord") # Set default level to WARNING to avoid noise _logger.setLevel(logging.WARNING) # Add handler if none exists if not _logger.handlers: handler = logging.StreamHandler() handler.setFormatter(logging.Formatter("%(name)s - %(levelname)s - %(message)s")) _logger.addHandler(handler) return _logger
[docs] def set_log_level(level: int) -> None: """Set the logging level for varlord. Args: level: Logging level (e.g., logging.DEBUG, logging.INFO) """ get_logger().setLevel(level)
[docs] def log_source_load(source_name: str, count: int) -> None: """Log source loading. Args: source_name: Name of the source count: Number of configuration items loaded """ logger = get_logger() if logger.isEnabledFor(logging.DEBUG): logger.debug(f"Loaded {count} items from source '{source_name}'")
[docs] def log_merge(source_name: str, key: str, value: Any) -> None: """Log configuration merge. Args: source_name: Name of the source key: Configuration key value: Configuration value """ logger = get_logger() if logger.isEnabledFor(logging.DEBUG): logger.debug(f"Merged '{key}' = {value!r} from source '{source_name}'")
[docs] def log_type_conversion(key: str, value: Any, target_type: type, result: Any) -> None: """Log type conversion. Args: key: Configuration key value: Original value target_type: Target type result: Converted value """ logger = get_logger() if logger.isEnabledFor(logging.DEBUG): if value != result or type(value) is not type(result): logger.debug( f"Converted '{key}': {value!r} ({type(value).__name__}) -> " f"{result!r} ({type(result).__name__})" )
[docs] def log_validation_error(key: str, value: Any, error: str) -> None: """Log validation error. Args: key: Configuration key value: Invalid value error: Error message """ logger = get_logger() logger.warning(f"Validation failed for '{key}' = {value!r}: {error}")
[docs] def log_config_loaded(model_name: str, keys: list[str]) -> None: """Log successful configuration load. Args: model_name: Name of the configuration model keys: List of loaded configuration keys """ logger = get_logger() if logger.isEnabledFor(logging.INFO): logger.info(f"Loaded configuration '{model_name}' with {len(keys)} keys")
[docs] def log_error(message: str, exc: Optional[Exception] = None) -> None: """Log error. Args: message: Error message exc: Optional exception """ logger = get_logger() logger.error(message, exc_info=exc)