chat / logging_config.py
rejig-ai's picture
Enhance user profiles and improve interface output formatting
527f6dc
"""
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
"""
# Create logs directory if it doesn't exist
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)
# Create timestamped log filename
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
log_filename = os.path.join(log_dir, f"app_{timestamp}.log")
# Create formatters
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'
)
# Create handlers
# File handler with rotation based on size
file_handler = RotatingFileHandler(
log_filename,
maxBytes=max_file_size_mb * 1024 * 1024, # Convert MB to bytes
backupCount=backup_count
)
file_handler.setFormatter(detailed_formatter)
file_handler.setLevel(getattr(logging, log_level.upper()))
# Console handler
console_handler = logging.StreamHandler()
console_handler.setFormatter(simple_formatter)
console_handler.setLevel(getattr(logging, log_level.upper()))
# Configure root logger
root_logger = logging.getLogger()
root_logger.setLevel(getattr(logging, log_level.upper()))
root_logger.handlers = [] # Clear existing handlers
root_logger.addHandler(file_handler)
root_logger.addHandler(console_handler)
# Create a separate logger for agent system with more detailed logging
agent_logger = logging.getLogger('agent_system')
agent_logger.setLevel(logging.DEBUG) # Always debug for agent system
# Suppress verbose HTTP client logs
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)
# Log initial messages
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
"""
# Create logs directory if it doesn't exist
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)
# Create daily log filename
log_filename = os.path.join(log_dir, "app.log")
# Create formatters
detailed_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# Create handlers
# File handler with daily rotation
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
console_handler = logging.StreamHandler()
console_handler.setFormatter(detailed_formatter)
console_handler.setLevel(getattr(logging, log_level.upper()))
# Configure root logger
root_logger = logging.getLogger()
root_logger.setLevel(getattr(logging, log_level.upper()))
root_logger.handlers = [] # Clear existing handlers
root_logger.addHandler(file_handler)
root_logger.addHandler(console_handler)
# Suppress verbose HTTP client logs
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