#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Logging system for Warp API server Provides comprehensive logging with file rotation and console output. """ import logging import os import shutil from datetime import datetime from logging.handlers import RotatingFileHandler from ..config.settings import LOGS_DIR def backup_existing_log(): """Backup existing log file with timestamp""" log_file = LOGS_DIR / 'warp_api.log' if log_file.exists(): timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') backup_name = f'warp_api_{timestamp}.log' backup_path = LOGS_DIR / backup_name try: shutil.move(str(log_file), str(backup_path)) print(f"Previous log backed up as: {backup_name}") except Exception as e: print(f"Warning: Could not backup log file: {e}") def setup_logging(): """Configure comprehensive logging system""" LOGS_DIR.mkdir(exist_ok=True) backup_existing_log() logger = logging.getLogger('warp_api') logger.setLevel(logging.DEBUG) for handler in logger.handlers[:]: logger.removeHandler(handler) file_handler = RotatingFileHandler( LOGS_DIR / 'warp_api.log', maxBytes=10*1024*1024, backupCount=5, encoding='utf-8' ) file_handler.setLevel(logging.DEBUG) console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s' ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(console_handler) return logger # Initialize logger logger = setup_logging() def log(*a): """Legacy log function for backward compatibility""" logger.info(" ".join(str(x) for x in a)) def set_log_file(log_file_name: str) -> None: """Reconfigure the global logger to write to a specific log file.""" try: LOGS_DIR.mkdir(exist_ok=True) except Exception: pass global logger target_logger = logging.getLogger('warp_api') for handler in target_logger.handlers[:]: try: target_logger.removeHandler(handler) try: handler.close() except Exception: pass except Exception: pass file_handler = RotatingFileHandler( LOGS_DIR / log_file_name, maxBytes=10*1024*1024, backupCount=5, encoding='utf-8' ) file_handler.setLevel(logging.DEBUG) console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s' ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter) target_logger.addHandler(file_handler) target_logger.addHandler(console_handler) logger = target_logger try: logger.info(f"Logging redirected to: {LOGS_DIR / log_file_name}") except Exception: pass