10 KiB
Logging and Error Handling Implementation Summary
This document summarizes the comprehensive logging and error handling improvements implemented in the ACC Server Manager project.
Overview
The logging system has been completely refactored to provide:
- Structured logging with separate files for each log level
- Base logger architecture using shared functionality
- Centralized error handling for all controllers
- Backward compatibility with existing code
- Enhanced debugging capabilities
Architecture Changes
New File Structure
acc-server-manager/local/utl/logging/
├── base.go # Base logger with core functionality
├── error.go # Error-specific logging methods
├── warn.go # Warning-specific logging methods
├── info.go # Info-specific logging methods
├── debug.go # Debug-specific logging methods
├── logger.go # Main logger for backward compatibility
└── USAGE_EXAMPLES.md # Comprehensive usage documentation
acc-server-manager/local/utl/error_handler/
└── controller_error_handler.go # Centralized controller error handling
acc-server-manager/local/middleware/logging/
└── request_logging.go # HTTP request/response logging middleware
Key Features Implemented
1. Structured Logging Architecture
Base Logger (base.go)
- Singleton pattern for consistent logging across the application
- Thread-safe operations with mutex protection
- Centralized file handling and formatting
- Support for custom caller depth tracking
- Panic recovery with stack trace logging
Specialized Loggers
Each log level has its own dedicated file with specialized methods:
Error Logger (error.go)
LogError(err, message)- Log error objects with optional contextLogWithStackTrace()- Include full stack traces for critical errorsLogFatal()- Log fatal errors that require application terminationLogWithContext()- Add contextual information to error logs
Info Logger (info.go)
LogStartup(component, message)- Application startup loggingLogShutdown(component, message)- Graceful shutdown loggingLogOperation(operation, details)- Business operation trackingLogRequest/LogResponse()- HTTP request/response loggingLogStatus()- Status change notifications
Warn Logger (warn.go)
LogDeprecation(feature, alternative)- Deprecation warningsLogConfiguration(setting, message)- Configuration issuesLogPerformance(operation, threshold, actual)- Performance warnings
Debug Logger (debug.go)
LogFunction(name, args)- Function call tracingLogVariable(name, value)- Variable state inspectionLogState(component, state)- Application state loggingLogSQL(query, args)- Database query loggingLogMemory()- Memory usage monitoringLogGoroutines()- Goroutine count trackingLogTiming(operation, duration)- Performance timing
2. Centralized Controller Error Handling
Controller Error Handler (controller_error_handler.go)
A comprehensive error handling system that:
- Automatically logs all controller errors with context information
- Provides standardized HTTP error responses
- Includes request metadata (method, path, IP, user agent)
- Sanitizes error messages (removes null bytes, handles internal errors)
- Categorizes errors by type for better debugging
Available Error Handler Methods:
HandleError(c *fiber.Ctx, err error, statusCode int, context ...string)
HandleValidationError(c *fiber.Ctx, err error, field string)
HandleDatabaseError(c *fiber.Ctx, err error)
HandleAuthError(c *fiber.Ctx, err error)
HandleNotFoundError(c *fiber.Ctx, resource string)
HandleBusinessLogicError(c *fiber.Ctx, err error)
HandleServiceError(c *fiber.Ctx, err error)
HandleParsingError(c *fiber.Ctx, err error)
HandleUUIDError(c *fiber.Ctx, field string)
3. Request Logging Middleware
Features:
- Automatic request/response logging for all HTTP endpoints
- Performance tracking with request duration measurement
- User agent tracking for debugging and analytics
- Error correlation between middleware and controller errors
Implementation Details
Controllers Updated
All controllers have been updated to use the centralized error handler:
-
ApiController (
api.go)- Replaced manual error logging with
HandleServiceError() - Added proper UUID validation with
HandleUUIDError() - Implemented consistent parsing error handling
- Replaced manual error logging with
-
ServerController (
server.go)- Standardized all error responses
- Added validation error handling for query filters
- Consistent UUID parameter validation
-
ConfigController (
config.go)- Enhanced error context for configuration operations
- Improved restart operation error handling
- Better parsing error management
-
LookupController (
lookup.go)- Simplified error handling for lookup operations
- Consistent service error responses
-
MembershipController (
membership.go)- Enhanced authentication error handling
- Improved user management error responses
- Better UUID validation for user operations
-
StateHistoryController (
stateHistory.go)- Standardized query filter validation errors
- Consistent service error handling
Main Application Changes
Updated cmd/api/main.go:
- Integrated new logging system initialization
- Added application lifecycle logging
- Enhanced startup/shutdown tracking
- Maintained backward compatibility with existing logger
Usage Examples
Basic Logging (Backward Compatible)
logging.Info("Server started on port %d", 8080)
logging.Error("Database connection failed: %v", err)
logging.Warn("Configuration missing, using defaults")
logging.Debug("Processing request ID: %s", requestID)
Enhanced Contextual Logging
logging.ErrorWithContext("DATABASE", "Connection pool exhausted: %v", err)
logging.InfoStartup("API_SERVER", "HTTP server listening on :8080")
logging.WarnConfiguration("database.max_connections", "Value too high, reducing to 100")
logging.DebugSQL("SELECT * FROM users WHERE active = ?", true)
Controller Error Handling
func (c *MyController) GetUser(ctx *fiber.Ctx) error {
userID, err := uuid.Parse(ctx.Params("id"))
if err != nil {
return c.errorHandler.HandleUUIDError(ctx, "user ID")
}
user, err := c.service.GetUser(userID)
if err != nil {
return c.errorHandler.HandleServiceError(ctx, err)
}
return ctx.JSON(user)
}
Benefits Achieved
1. Comprehensive Error Logging
- Every controller error is now automatically logged with full context
- Standardized error format across all API endpoints
- Rich debugging information including file, line, method, path, and IP
- Stack traces for critical errors
2. Improved Debugging Capabilities
- Specialized logging methods for different types of operations
- Performance monitoring with timing and memory usage tracking
- Database query logging for optimization
- Request/response correlation for API debugging
3. Better Code Organization
- Separation of concerns with dedicated logger files
- Consistent error handling across all controllers
- Reduced code duplication in error management
- Cleaner controller code with centralized error handling
4. Enhanced Observability
- Structured log output with consistent formatting
- Contextual information for better log analysis
- Application lifecycle tracking for operational insights
- Performance metrics for optimization opportunities
5. Backward Compatibility
- Existing logging calls continue to work without modification
- Gradual migration path to new features
- No breaking changes to existing functionality
Log Output Format
All logs follow a consistent format:
[2024-01-15 10:30:45.123] [LEVEL] [file.go:line] [CONTEXT] Message with details
Examples:
[2024-01-15 10:30:45.123] [INFO] [server.go:45] [STARTUP] HTTP server started on port 8080
[2024-01-15 10:30:46.456] [ERROR] [database.go:12] [CONTROLLER_ERROR [api.go:67]] [SERVICE] Connection timeout: dial tcp 127.0.0.1:5432: timeout
[2024-01-15 10:30:47.789] [WARN] [config.go:23] [CONFIG] Missing database.max_connections, using default: 50
[2024-01-15 10:30:48.012] [DEBUG] [handler.go:34] [REQUEST] GET /api/v1/servers User-Agent: curl/7.68.0
Migration Impact
Zero Breaking Changes
- All existing
logging.Info(),logging.Error(), etc. calls continue to work - No changes required to existing service or repository layers
- Controllers benefit from automatic error logging without code changes
Immediate Benefits
- All controller errors are now logged automatically
- Better error responses with consistent format
- Enhanced debugging with contextual information
- Performance insights through timing logs
Configuration
Automatic Setup
- Logs are automatically written to
logs/acc-server-YYYY-MM-DD.log - Both console and file output are enabled
- Thread-safe operation across all components
- Automatic log rotation by date
Customization Options
- Individual logger instances can be created for specific components
- Context information can be added to any log entry
- Error handler behavior can be customized per controller
- Request logging middleware can be selectively applied
Future Enhancements
The new logging architecture provides a foundation for:
- Log level filtering based on environment
- Structured JSON logging for log aggregation systems
- Metrics collection integration
- Distributed tracing correlation
- Custom log formatters for different output targets
Conclusion
This implementation provides a robust, scalable logging and error handling system that:
- Ensures all controller errors are logged with rich context
- Maintains full backward compatibility with existing code
- Provides specialized logging capabilities for different use cases
- Improves debugging and operational visibility
- Establishes a foundation for future observability enhancements
The system is production-ready and provides immediate benefits while supporting future growth and enhancement needs.