Logging Utilities

Code Properties

  • Language: Python
  • Modules: logging, pydantic

Overview

Utility functions for setting up Python logging with configurable settings and consistent formatting.

Code

Logger Utility

"""Logging Utilities"""
import logging
from typing import Optional
 
from settings import Settings
 
 
def get_logger(settings: Optional[Settings] = None) -> logging.Logger:
    """Get configured Logger instance.
    
    Args:
        settings: Optional Settings object with log_level
        
    Returns:
        Configured Logger instance
    """
    logger = logging.getLogger("<project>")
    logger.setLevel(settings.log_level if settings else "INFO")
 
    # clear existing handlers
    for handler in logger.handlers[:]:
        logger.removeHandler(handler)
 
    handler = logging.StreamHandler()
    handler.setLevel(settings.log_level if settings else "INFO")
    formatter = logging.Formatter(
        "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    )
    handler.setFormatter(formatter)
    logger.addHandler(handler)
 
    return logger

Settings Configuration

"""Settings Configuration"""
import typing
from functools import lru_cache
from pydantic_yaml import YamlModel
 
 
class Settings(YamlModel):
    api_key: typing.Optional[str] = None
    log_level: str = "INFO"
 
 
@lru_cache()
def get_settings_from_file(path: str = "config.yml") -> Settings:
    """Load settings from YAML file with caching."""
    settings = Settings.parse_file(path)
    return settings

Usage

from logging_utils import get_logger
from settings import get_settings_from_file
 
# get settings and logger
settings = get_settings_from_file("config.yml")
logger = get_logger(settings)
 
# use the logger
logger.info("Application started")
logger.warning("This is a warning")
logger.error("An error occurred")

Appendix

Note created on 2024-04-15 and last modified on 2024-12-31.

See Also


(c) No Clocks, LLC | 2024