|
|
""" |
|
|
Centralized Logging Configuration |
|
|
""" |
|
|
import logging |
|
|
import sys |
|
|
from pathlib import Path |
|
|
|
|
|
|
|
|
COLORS = { |
|
|
"DEBUG": "\033[36m", |
|
|
"INFO": "\033[32m", |
|
|
"WARNING": "\033[33m", |
|
|
"ERROR": "\033[31m", |
|
|
"CRITICAL": "\033[35m", |
|
|
"RESET": "\033[0m", |
|
|
} |
|
|
|
|
|
class ColoredFormatter(logging.Formatter): |
|
|
"""Custom formatter with colors for terminal output""" |
|
|
def format(self, record): |
|
|
|
|
|
levelname = record.levelname |
|
|
if levelname in COLORS: |
|
|
record.levelname = f"{COLORS[levelname]}{levelname}{COLORS['RESET']}" |
|
|
return super().format(record) |
|
|
|
|
|
import os |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
root_logger = logging.getLogger() |
|
|
|
|
|
|
|
|
root_logger.setLevel(level) |
|
|
|
|
|
|
|
|
if not root_logger.handlers: |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
for handler in root_logger.handlers: |
|
|
handler.setLevel(level) |
|
|
|
|
|
|
|
|
return logging.getLogger(name) |
|
|
|
|
|
|
|
|
logger = setup_logger() |
|
|
|