File size: 3,883 Bytes
141cd60
 
 
 
ce00133
8e4018d
141cd60
a6f0289
 
141cd60
a6f0289
141cd60
 
a6f0289
141cd60
a6f0289
 
141cd60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6f0289
141cd60
 
 
a6f0289
141cd60
a6f0289
 
 
 
 
 
141cd60
 
 
a6f0289
 
 
141cd60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6f0289
141cd60
a6f0289
 
141cd60
 
a6f0289
141cd60
 
 
a6f0289
141cd60
436bd7b
141cd60
 
 
 
 
 
 
 
ce00133
141cd60
 
 
 
 
ce00133
141cd60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce00133
141cd60
 
ce00133
 
141cd60
ce00133
1c0efba
141cd60
 
 
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
"""
Logging utilities for the MONA application
Fixed version with all required functions
"""

import logging
import os
import sys
from datetime import datetime
from pathlib import Path


def setup_logging(log_level=logging.INFO, log_file=None):
    """
    Set up logging configuration
    
    Args:
        log_level: Logging level (default: INFO)
        log_file: Optional log file path
    """
    # Create logs directory if it doesn't exist
    if log_file:
        log_dir = Path(log_file).parent
        log_dir.mkdir(exist_ok=True)
    
    # Configure logging format
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    # Set up root logger
    root_logger = logging.getLogger()
    root_logger.setLevel(log_level)
    
    # Clear existing handlers
    root_logger.handlers.clear()
    
    # Console handler
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setFormatter(formatter)
    root_logger.addHandler(console_handler)
    
    # File handler if specified
    if log_file:
        file_handler = logging.FileHandler(log_file)
        file_handler.setFormatter(formatter)
        root_logger.addHandler(file_handler)


def get_logger(name=None):
    """
    Get a logger instance
    
    Args:
        name: Logger name (default: __name__)
        
    Returns:
        logging.Logger: Logger instance
    """
    if name is None:
        name = __name__
    
    logger = logging.getLogger(name)
    
    # If no handlers are set up, set up basic logging
    if not logger.handlers and not logging.getLogger().handlers:
        setup_logging()
    
    return logger


def log_error(message, error=None, extra_data=None):
    """
    Log error messages with optional error details and extra data
    
    Args:
        message (str): The error message to log
        error (Exception, optional): The exception object if available
        extra_data (dict, optional): Additional data to include in log
    """
    logger = get_logger()
    
    if error:
        error_msg = f"{message}: {str(error)}"
        if hasattr(error, '__traceback__'):
            import traceback
            error_msg += f"\nTraceback: {traceback.format_exc()}"
    else:
        error_msg = message
    
    if extra_data:
        logger.error(error_msg, extra=extra_data)
    else:
        logger.error(error_msg)


def log_warning(message, extra_data=None):
    """
    Log warning messages
    
    Args:
        message (str): The warning message to log
        extra_data (dict, optional): Additional data to include in log
    """
    logger = get_logger()
    if extra_data:
        logger.warning(message, extra=extra_data)
    else:
        logger.warning(message)


def log_info(message, extra_data=None):
    """
    Log info messages
    
    Args:
        message (str): The info message to log
        extra_data (dict, optional): Additional data to include in log
    """
    logger = get_logger()
    if extra_data:
        logger.info(message, extra=extra_data)
    else:
        logger.info(message)


def log_debug(message, extra_data=None):
    """
    Log debug messages
    
    Args:
        message (str): The debug message to log
        extra_data (dict, optional): Additional data to include in log
    """
    logger = get_logger()
    if extra_data:
        logger.debug(message, extra=extra_data)
    else:
        logger.debug(message)


def log_exception(message, exc_info=True):
    """
    Log exceptions with full traceback
    
    Args:
        message (str): The exception message to log
        exc_info (bool): Whether to include exception info
    """
    logger = get_logger()
    logger.exception(message, exc_info=exc_info)


# Initialize logging when module is imported
if __name__ != "__main__":
    setup_logging()