Source code for Vaani.utils.logger

"""
Logger - Professional Logging System
=======================================

Features:
- Minimal, production-ready logging
- Error-focused output (no verbose spam)
- Color-coded console output
- File logging with rotation (1MB limit, 3 backups)
- Module-specific loggers
- Configurable log levels
- Thread-safe logging
- Performance impact minimal
- Professional formatting

Provides clean, professional logging that only shows what matters.
No emoji spam, no unnecessary info logs - just errors and critical
warnings when something needs attention.

Vaani Voice Assistant
Copyright (c) 2026 Aman Kumar Pandey.
All Rights Reserved.

This file is part of the Vaani Voice Assistant core and is proprietary.
"""

"""
Centralized Logging System

Provides structured logging with file rotation and console output.

Features:
- Color-coded console output for different log levels
- Automatic log file rotation
- Structured formatting for easy parsing
- Debug and production log levels

"""

import logging
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Optional
from ..config import settings

[docs] class VaaniLogger: """Custom logger for Vaani with advanced features""" _instance: Optional[logging.Logger] = None
[docs] @classmethod def get_logger(cls, name: str = 'vaani') -> logging.Logger: """Get or create logger instance""" if cls._instance is None: cls._instance = cls._create_logger(name) return cls._instance
@classmethod def _create_logger(cls, name: str) -> logging.Logger: """Create and configure logger""" logger = logging.getLogger(name) # Clear existing handlers if logger.handlers: logger.handlers.clear() # Set log level configured_level = getattr(logging, settings.LOG_LEVEL.upper(), logging.INFO) final_level = logging.DEBUG if settings.DEBUG_MODE else configured_level logger.setLevel(final_level) # Create formatters detailed_formatter = logging.Formatter( '%(asctime)s | %(levelname)-8s | %(name)s | %(module)s:%(lineno)d | %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) simple_formatter = logging.Formatter( '%(levelname)s: %(message)s' ) # File handler with rotation log_file = settings.LOGS_DIR / 'vaani.log' file_handler = RotatingFileHandler( log_file, maxBytes=settings.LOG_MAX_BYTES, backupCount=settings.LOG_BACKUP_COUNT ) file_handler.setLevel(logging.DEBUG) # Always log everything to file for debugging file_handler.setFormatter(detailed_formatter) logger.addHandler(file_handler) # Console handler - respects configuration console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(final_level) console_handler.setFormatter(simple_formatter if not settings.DEBUG_MODE else detailed_formatter) logger.addHandler(console_handler) # Prevent propagation to root logger logger.propagate = False return logger
# Convenience functions logger = VaaniLogger.get_logger()
[docs] def debug(msg: str, *args, **kwargs): """Log debug message""" logger.debug(msg, *args, **kwargs)
[docs] def info(msg: str, *args, **kwargs): """Log info message""" logger.info(msg, *args, **kwargs)
[docs] def warning(msg: str, *args, **kwargs): """Log warning message""" logger.warning(msg, *args, **kwargs)
[docs] def error(msg: str, *args, **kwargs): """Log error message""" logger.error(msg, *args, **kwargs)
[docs] def critical(msg: str, *args, **kwargs): """Log critical message""" logger.critical(msg, *args, **kwargs)
[docs] def exception(msg: str, *args, **kwargs): """Log exception with traceback""" logger.exception(msg, *args, **kwargs)