Tools / src /logger_config.py
jebin2's picture
feat: Implement centralized logging with colored output, verbose control, and updated log levels across the application.
175adcc
"""
Centralized Logging Configuration
"""
import logging
import sys
from pathlib import Path
# ANSI color codes
COLORS = {
"DEBUG": "\033[36m", # Cyan
"INFO": "\033[32m", # Green
"WARNING": "\033[33m", # Yellow
"ERROR": "\033[31m", # Red
"CRITICAL": "\033[35m", # Magenta
"RESET": "\033[0m", # Reset
}
class ColoredFormatter(logging.Formatter):
"""Custom formatter with colors for terminal output"""
def format(self, record):
# Add color to level name
levelname = record.levelname
if levelname in COLORS:
record.levelname = f"{COLORS[levelname]}{levelname}{COLORS['RESET']}"
return super().format(record)
import os
# ... (omitted)
def setup_logger(name="ContentAutomation", level=None, log_file=None):
"""
Configure and return a logger.
Configures the ROOT logger to ensure consistent formatting across all modules.
Default level is INFO, or DEBUG if VERBOSE env var is set.
"""
if level is None:
level = logging.DEBUG if os.getenv("VERBOSE", "false").lower() == "true" else logging.INFO
# Configure Root Logger
root_logger = logging.getLogger()
# Always update the level (in case of reload or dynamic change)
root_logger.setLevel(level)
# Avoid adding handlers multiple times to root
if not root_logger.handlers:
# Console handler with colors
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(level)
console_formatter = ColoredFormatter(fmt="%(asctime)s | %(levelname)s | %(message)s", datefmt="%H:%M:%S")
console_handler.setFormatter(console_formatter)
root_logger.addHandler(console_handler)
# File handler if specified
if log_file:
log_path = Path(log_file)
log_path.parent.mkdir(parents=True, exist_ok=True)
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(level)
file_formatter = logging.Formatter(
fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
)
file_handler.setFormatter(file_formatter)
root_logger.addHandler(file_handler)
else:
# If handlers exist, ensure they also respect the new level
for handler in root_logger.handlers:
handler.setLevel(level)
# Return the specific logger instance
return logging.getLogger(name)
# Global logger instance
logger = setup_logger()