import sys import os from pathlib import Path from datetime import datetime from typing import Optional from loguru import logger from config import Settings # Basic fallback logging configuration logger.remove() logger.add(sys.stderr, level="WARNING", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}") def configure_logging(log_level: str = "INFO", log_dir: Optional[str] = None): """Configure structured logging for the application with fallback handling""" try: # Log that we're attempting to configure logging # Default log directory if not log_dir: log_dir = os.getenv("LOG_DIR", "logs") # Create log directory if it doesn't exist Path(log_dir).mkdir(parents=True, exist_ok=True) # Log file path with timestamp log_file = Path(log_dir) / f"jira-webhook-llm_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log" # Remove any existing loggers logger.remove() # Add console logger logger.add( sys.stdout, level=log_level, format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {extra[request_id]} | {message}", colorize=True, backtrace=True, diagnose=True ) # Add file logger logger.add( str(log_file), level=log_level, format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {extra[request_id]} | {message}", rotation="100 MB", retention="30 days", compression="zip", backtrace=True, diagnose=True ) # Configure default extras # Configure thread-safe defaults logger.configure( extra={"request_id": "N/A"}, patcher=lambda record: record["extra"].update( thread_id = record["thread"].id if hasattr(record.get("thread"), 'id') else "main" ) ) logger.info("Logging configured successfully") settings = Settings() # Removed duplicate logging_ready.set() call logger.debug("Signaled logging_ready event") except Exception as e: # Fallback to basic logging if configuration fails logger.remove() logger.add(sys.stderr, level="WARNING", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}") logger.error(f"Failed to configure logging: {str(e)}. Using fallback logging configuration.") settings = Settings() try: settings.logging_ready.set() logger.debug("Signaled logging_ready event") except Exception as inner_e: logger.error(f"Failed to signal logging_ready: {str(inner_e)}") raise # Re-raise the original exception