Edwin Salguero
Initial commit: Enhanced Algorithmic Trading System with Synthetic Data Generation, Comprehensive Logging, and Extensive Testing
859af74
import logging
import logging.handlers
import os
from datetime import datetime
from typing import Dict, Optional
def setup_logging(config: Dict, log_level: str = 'INFO') -> None:
"""
Set up comprehensive logging for the trading system.
Args:
config: Configuration dictionary
log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
"""
# Create logs directory if it doesn't exist
log_dir = config.get('logging', {}).get('log_dir', 'logs')
os.makedirs(log_dir, exist_ok=True)
# Configure root logger
root_logger = logging.getLogger()
root_logger.setLevel(getattr(logging, log_level.upper()))
# Clear any existing handlers
root_logger.handlers.clear()
# Create formatters
detailed_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s'
)
simple_formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - %(message)s'
)
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(simple_formatter)
root_logger.addHandler(console_handler)
# File handler for all logs
all_logs_file = os.path.join(log_dir, 'trading_system.log')
file_handler = logging.handlers.RotatingFileHandler(
all_logs_file,
maxBytes=10*1024*1024, # 10MB
backupCount=5
)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(detailed_formatter)
root_logger.addHandler(file_handler)
# Error log file
error_log_file = os.path.join(log_dir, 'errors.log')
error_handler = logging.handlers.RotatingFileHandler(
error_log_file,
maxBytes=5*1024*1024, # 5MB
backupCount=3
)
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(detailed_formatter)
root_logger.addHandler(error_handler)
# Trading-specific log file
trading_log_file = os.path.join(log_dir, 'trading.log')
trading_handler = logging.handlers.RotatingFileHandler(
trading_log_file,
maxBytes=10*1024*1024, # 10MB
backupCount=5
)
trading_handler.setLevel(logging.INFO)
trading_handler.setFormatter(detailed_formatter)
# Create trading logger
trading_logger = logging.getLogger('trading')
trading_logger.addHandler(trading_handler)
trading_logger.setLevel(logging.INFO)
trading_logger.propagate = False
# Performance log file
performance_log_file = os.path.join(log_dir, 'performance.log')
performance_handler = logging.handlers.RotatingFileHandler(
performance_log_file,
maxBytes=5*1024*1024, # 5MB
backupCount=3
)
performance_handler.setLevel(logging.INFO)
performance_handler.setFormatter(detailed_formatter)
# Create performance logger
performance_logger = logging.getLogger('performance')
performance_logger.addHandler(performance_handler)
performance_logger.setLevel(logging.INFO)
performance_logger.propagate = False
logging.info(f"Logging system initialized. Log files in: {log_dir}")
def get_logger(name: str) -> logging.Logger:
"""
Get a logger instance for a specific module.
Args:
name: Logger name (usually __name__)
Returns:
Logger instance
"""
return logging.getLogger(name)
def log_trade(logger: logging.Logger, trade_data: Dict) -> None:
"""
Log trade execution details.
Args:
logger: Logger instance
trade_data: Dictionary containing trade information
"""
logger.info(f"TRADE EXECUTED: {trade_data}")
def log_performance(logger: logging.Logger, performance_data: Dict) -> None:
"""
Log performance metrics.
Args:
logger: Logger instance
performance_data: Dictionary containing performance metrics
"""
perf_logger = logging.getLogger('performance')
perf_logger.info(f"PERFORMANCE: {performance_data}")
def log_error(logger: logging.Logger, error: Exception, context: Optional[str] = None) -> None:
"""
Log errors with context.
Args:
logger: Logger instance
error: Exception that occurred
context: Additional context information
"""
error_msg = f"ERROR: {type(error).__name__}: {str(error)}"
if context:
error_msg += f" | Context: {context}"
logger.error(error_msg, exc_info=True)