File size: 5,161 Bytes
aae35f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
"""
Debug configuration for Auto Diffusers Config
Provides centralized logging setup for the entire application
"""

import logging
import os
from datetime import datetime

def setup_debug_logging(log_level='DEBUG', log_to_file=True, log_to_console=True):
    """
    Set up comprehensive debug logging for the entire application
    
    Args:
        log_level (str): Logging level ('DEBUG', 'INFO', 'WARNING', 'ERROR')
        log_to_file (bool): Whether to log to files
        log_to_console (bool): Whether to log to console
    """
    
    # Create logs directory if it doesn't exist
    if log_to_file:
        os.makedirs('logs', exist_ok=True)
    
    # Clear any existing handlers
    root_logger = logging.getLogger()
    root_logger.handlers.clear()
    
    # Set root logging level
    numeric_level = getattr(logging, log_level.upper(), logging.DEBUG)
    root_logger.setLevel(numeric_level)
    
    # Create formatter
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    handlers = []
    
    # Console handler
    if log_to_console:
        console_handler = logging.StreamHandler()
        console_handler.setLevel(numeric_level)
        console_handler.setFormatter(formatter)
        handlers.append(console_handler)
    
    # File handlers
    if log_to_file:
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        
        # Main application log
        main_log_file = f'logs/auto_diffusers_{timestamp}.log'
        file_handler = logging.FileHandler(main_log_file)
        file_handler.setLevel(numeric_level)
        file_handler.setFormatter(formatter)
        handlers.append(file_handler)
        
        # Error-only log
        error_log_file = f'logs/errors_{timestamp}.log'
        error_handler = logging.FileHandler(error_log_file)
        error_handler.setLevel(logging.ERROR)
        error_handler.setFormatter(formatter)
        handlers.append(error_handler)
    
    # Add all handlers to root logger
    for handler in handlers:
        root_logger.addHandler(handler)
    
    # Set up specific logger configurations
    configure_component_loggers(numeric_level)
    
    logging.info("=" * 80)
    logging.info("AUTO DIFFUSERS CONFIG - DEBUG SESSION STARTED")
    logging.info("=" * 80)
    logging.info(f"Log level: {log_level}")
    logging.info(f"Logging to console: {log_to_console}")
    logging.info(f"Logging to file: {log_to_file}")
    if log_to_file:
        logging.info(f"Main log file: {main_log_file}")
        logging.info(f"Error log file: {error_log_file}")
    logging.info("=" * 80)


def configure_component_loggers(level):
    """Configure logging for individual components"""
    
    # Main application components
    components = [
        'auto_diffusers',
        'hardware_detector', 
        'simple_memory_calculator',
        'gradio_app',
        '__main__'
    ]
    
    for component in components:
        logger = logging.getLogger(component)
        logger.setLevel(level)
        # Don't propagate to avoid duplicate messages
        logger.propagate = True
    
    # Third-party library logging (reduce verbosity)
    third_party_loggers = {
        'urllib3': logging.WARNING,
        'requests': logging.WARNING,
        'httpx': logging.WARNING,
        'gradio': logging.INFO,
        'google': logging.INFO,
        'huggingface_hub': logging.INFO
    }
    
    for lib_name, lib_level in third_party_loggers.items():
        lib_logger = logging.getLogger(lib_name)
        lib_logger.setLevel(lib_level)


def log_system_info():
    """Log comprehensive system information at startup"""
    import platform
    import sys
    import os
    
    logger = logging.getLogger(__name__)
    
    logger.info("SYSTEM INFORMATION:")
    logger.info(f"  Platform: {platform.system()} {platform.release()}")
    logger.info(f"  Architecture: {platform.machine()}")
    logger.info(f"  Python: {sys.version}")
    logger.info(f"  Working directory: {os.getcwd()}")
    logger.info(f"  Process ID: {os.getpid()}")
    
    # Environment variables (non-sensitive)
    env_vars = ['GOOGLE_API_KEY', 'CUDA_VISIBLE_DEVICES', 'PYTORCH_CUDA_ALLOC_CONF']
    logger.info("ENVIRONMENT VARIABLES:")
    for var in env_vars:
        value = os.getenv(var, 'Not set')
        if var == 'GOOGLE_API_KEY' and value != 'Not set':
            value = f"Set (length: {len(value)})"
        logger.info(f"  {var}: {value}")


def log_session_end():
    """Log session end information"""
    logger = logging.getLogger(__name__)
    logger.info("=" * 80)
    logger.info("AUTO DIFFUSERS CONFIG - DEBUG SESSION ENDED")
    logger.info("=" * 80)


if __name__ == "__main__":
    # Example usage
    setup_debug_logging(log_level='DEBUG')
    log_system_info()
    
    # Test logging from different components
    logger = logging.getLogger(__name__)
    logger.debug("This is a debug message")
    logger.info("This is an info message")
    logger.warning("This is a warning message")
    logger.error("This is an error message")
    
    log_session_end()