137 lines
3.9 KiB
Python
137 lines
3.9 KiB
Python
"""Centralized logging service for the application."""
|
|
|
|
import logging
|
|
import sys
|
|
|
|
|
|
class LoggingService:
|
|
"""Service for configuring and managing application logging."""
|
|
|
|
@staticmethod
|
|
def setup_logging(
|
|
level: str = "INFO",
|
|
format_string: str | None = None,
|
|
) -> None:
|
|
"""Setup application-wide logging configuration."""
|
|
if format_string is None:
|
|
format_string = (
|
|
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
)
|
|
|
|
# Configure root logger
|
|
logging.basicConfig(
|
|
level=getattr(logging, level.upper()),
|
|
format=format_string,
|
|
handlers=[
|
|
logging.StreamHandler(sys.stdout),
|
|
],
|
|
)
|
|
|
|
# Set specific logger levels for third-party libraries
|
|
logging.getLogger("werkzeug").setLevel(logging.WARNING)
|
|
logging.getLogger("urllib3").setLevel(logging.WARNING)
|
|
logging.getLogger("requests").setLevel(logging.WARNING)
|
|
|
|
@staticmethod
|
|
def get_logger(name: str) -> logging.Logger:
|
|
"""Get a logger instance for a specific module."""
|
|
return logging.getLogger(name)
|
|
|
|
@staticmethod
|
|
def log_operation_start(logger: logging.Logger, operation: str) -> None:
|
|
"""Log the start of an operation."""
|
|
logger.info(f"Starting {operation}")
|
|
|
|
@staticmethod
|
|
def log_operation_success(
|
|
logger: logging.Logger,
|
|
operation: str,
|
|
details: str | None = None,
|
|
) -> None:
|
|
"""Log successful completion of an operation."""
|
|
message = f"Successfully completed {operation}"
|
|
if details:
|
|
message += f" - {details}"
|
|
logger.info(message)
|
|
|
|
@staticmethod
|
|
def log_operation_error(
|
|
logger: logging.Logger,
|
|
operation: str,
|
|
error: Exception,
|
|
) -> None:
|
|
"""Log an error during an operation."""
|
|
logger.error(f"Error during {operation}: {error}")
|
|
|
|
@staticmethod
|
|
def log_validation_error(
|
|
logger: logging.Logger,
|
|
field: str,
|
|
value: str,
|
|
reason: str,
|
|
) -> None:
|
|
"""Log validation errors consistently."""
|
|
logger.warning(f"Validation failed for {field}='{value}': {reason}")
|
|
|
|
@staticmethod
|
|
def log_resource_not_found(
|
|
logger: logging.Logger,
|
|
resource_type: str,
|
|
identifier: str,
|
|
) -> None:
|
|
"""Log when a resource is not found."""
|
|
logger.warning(f"{resource_type} not found: {identifier}")
|
|
|
|
@staticmethod
|
|
def log_resource_created(
|
|
logger: logging.Logger,
|
|
resource_type: str,
|
|
identifier: str,
|
|
) -> None:
|
|
"""Log when a resource is created."""
|
|
logger.info(f"Created {resource_type}: {identifier}")
|
|
|
|
@staticmethod
|
|
def log_resource_updated(
|
|
logger: logging.Logger,
|
|
resource_type: str,
|
|
identifier: str,
|
|
) -> None:
|
|
"""Log when a resource is updated."""
|
|
logger.info(f"Updated {resource_type}: {identifier}")
|
|
|
|
@staticmethod
|
|
def log_resource_deleted(
|
|
logger: logging.Logger,
|
|
resource_type: str,
|
|
identifier: str,
|
|
) -> None:
|
|
"""Log when a resource is deleted."""
|
|
logger.info(f"Deleted {resource_type}: {identifier}")
|
|
|
|
@staticmethod
|
|
def log_user_action(
|
|
logger: logging.Logger,
|
|
user_id: str,
|
|
action: str,
|
|
resource: str | None = None,
|
|
) -> None:
|
|
"""Log user actions for auditing."""
|
|
message = f"User {user_id} performed action: {action}"
|
|
if resource:
|
|
message += f" on {resource}"
|
|
logger.info(message)
|
|
|
|
@staticmethod
|
|
def log_security_event(
|
|
logger: logging.Logger,
|
|
event_type: str,
|
|
details: str,
|
|
user_id: str | None = None,
|
|
) -> None:
|
|
"""Log security-related events."""
|
|
message = f"Security event [{event_type}]: {details}"
|
|
if user_id:
|
|
message += f" (User: {user_id})"
|
|
logger.warning(message)
|