|
""" |
|
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 |
|
""" |
|
|
|
if log_file: |
|
log_dir = Path(log_file).parent |
|
log_dir.mkdir(exist_ok=True) |
|
|
|
|
|
formatter = logging.Formatter( |
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
|
datefmt='%Y-%m-%d %H:%M:%S' |
|
) |
|
|
|
|
|
root_logger = logging.getLogger() |
|
root_logger.setLevel(log_level) |
|
|
|
|
|
root_logger.handlers.clear() |
|
|
|
|
|
console_handler = logging.StreamHandler(sys.stdout) |
|
console_handler.setFormatter(formatter) |
|
root_logger.addHandler(console_handler) |
|
|
|
|
|
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 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) |
|
|
|
|
|
|
|
if __name__ != "__main__": |
|
setup_logging() |