| """ |
| Advanced logging configuration with rotation and formatting. |
| """ |
| import os |
| import logging |
| import datetime |
| from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler |
|
|
| def setup_logging(log_level="DEBUG", max_file_size_mb=10, backup_count=5): |
| """ |
| Set up logging with both file and console output. |
| |
| Args: |
| log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
| max_file_size_mb: Maximum size of each log file in MB before rotation |
| backup_count: Number of backup files to keep |
| """ |
| |
| log_dir = "logs" |
| os.makedirs(log_dir, exist_ok=True) |
| |
| |
| timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") |
| log_filename = os.path.join(log_dir, f"app_{timestamp}.log") |
| |
| |
| detailed_formatter = logging.Formatter( |
| '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s', |
| datefmt='%Y-%m-%d %H:%M:%S' |
| ) |
| |
| simple_formatter = logging.Formatter( |
| '%(asctime)s - %(levelname)s - %(message)s', |
| datefmt='%H:%M:%S' |
| ) |
| |
| |
| |
| file_handler = RotatingFileHandler( |
| log_filename, |
| maxBytes=max_file_size_mb * 1024 * 1024, |
| backupCount=backup_count |
| ) |
| file_handler.setFormatter(detailed_formatter) |
| file_handler.setLevel(getattr(logging, log_level.upper())) |
| |
| |
| console_handler = logging.StreamHandler() |
| console_handler.setFormatter(simple_formatter) |
| console_handler.setLevel(getattr(logging, log_level.upper())) |
| |
| |
| root_logger = logging.getLogger() |
| root_logger.setLevel(getattr(logging, log_level.upper())) |
| root_logger.handlers = [] |
| root_logger.addHandler(file_handler) |
| root_logger.addHandler(console_handler) |
| |
| |
| agent_logger = logging.getLogger('agent_system') |
| agent_logger.setLevel(logging.DEBUG) |
| |
| |
| logging.getLogger('httpcore.http11').setLevel(logging.WARNING) |
| logging.getLogger('httpcore.connection').setLevel(logging.WARNING) |
| logging.getLogger('httpx').setLevel(logging.WARNING) |
| logging.getLogger('openai._base_client').setLevel(logging.WARNING) |
| logging.getLogger('multipart').setLevel(logging.WARNING) |
| |
| |
| logger = logging.getLogger(__name__) |
| logger.info("="*60) |
| logger.info(f"Application starting - Log file: {log_filename}") |
| logger.info(f"Environment: {os.getenv('ENVIRONMENT', 'development')}") |
| logger.info(f"Log level: {log_level}") |
| logger.info(f"Max file size: {max_file_size_mb}MB, Backup count: {backup_count}") |
| logger.info("="*60) |
| |
| return log_filename |
|
|
| def setup_daily_logging(log_level="INFO", days_to_keep=7): |
| """ |
| Set up logging with daily rotation. |
| |
| Args: |
| log_level: Logging level |
| days_to_keep: Number of days of logs to keep |
| """ |
| |
| log_dir = "logs" |
| os.makedirs(log_dir, exist_ok=True) |
| |
| |
| log_filename = os.path.join(log_dir, "app.log") |
| |
| |
| detailed_formatter = logging.Formatter( |
| '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s', |
| datefmt='%Y-%m-%d %H:%M:%S' |
| ) |
| |
| |
| |
| file_handler = TimedRotatingFileHandler( |
| log_filename, |
| when='midnight', |
| interval=1, |
| backupCount=days_to_keep |
| ) |
| file_handler.setFormatter(detailed_formatter) |
| file_handler.setLevel(getattr(logging, log_level.upper())) |
| |
| |
| console_handler = logging.StreamHandler() |
| console_handler.setFormatter(detailed_formatter) |
| console_handler.setLevel(getattr(logging, log_level.upper())) |
| |
| |
| root_logger = logging.getLogger() |
| root_logger.setLevel(getattr(logging, log_level.upper())) |
| root_logger.handlers = [] |
| root_logger.addHandler(file_handler) |
| root_logger.addHandler(console_handler) |
| |
| |
| logging.getLogger('httpcore.http11').setLevel(logging.WARNING) |
| logging.getLogger('httpcore.connection').setLevel(logging.WARNING) |
| logging.getLogger('httpx').setLevel(logging.WARNING) |
| logging.getLogger('openai._base_client').setLevel(logging.WARNING) |
| logging.getLogger('multipart').setLevel(logging.WARNING) |
| |
| return log_filename |