275 lines
10 KiB
Markdown
275 lines
10 KiB
Markdown
# 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 context
|
|
- `LogWithStackTrace()` - Include full stack traces for critical errors
|
|
- `LogFatal()` - Log fatal errors that require application termination
|
|
- `LogWithContext()` - Add contextual information to error logs
|
|
|
|
**Info Logger (`info.go`)**
|
|
- `LogStartup(component, message)` - Application startup logging
|
|
- `LogShutdown(component, message)` - Graceful shutdown logging
|
|
- `LogOperation(operation, details)` - Business operation tracking
|
|
- `LogRequest/LogResponse()` - HTTP request/response logging
|
|
- `LogStatus()` - Status change notifications
|
|
|
|
**Warn Logger (`warn.go`)**
|
|
- `LogDeprecation(feature, alternative)` - Deprecation warnings
|
|
- `LogConfiguration(setting, message)` - Configuration issues
|
|
- `LogPerformance(operation, threshold, actual)` - Performance warnings
|
|
|
|
**Debug Logger (`debug.go`)**
|
|
- `LogFunction(name, args)` - Function call tracing
|
|
- `LogVariable(name, value)` - Variable state inspection
|
|
- `LogState(component, state)` - Application state logging
|
|
- `LogSQL(query, args)` - Database query logging
|
|
- `LogMemory()` - Memory usage monitoring
|
|
- `LogGoroutines()` - Goroutine count tracking
|
|
- `LogTiming(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:
|
|
```go
|
|
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:
|
|
|
|
1. **ApiController** (`api.go`)
|
|
- Replaced manual error logging with `HandleServiceError()`
|
|
- Added proper UUID validation with `HandleUUIDError()`
|
|
- Implemented consistent parsing error handling
|
|
|
|
2. **ServerController** (`server.go`)
|
|
- Standardized all error responses
|
|
- Added validation error handling for query filters
|
|
- Consistent UUID parameter validation
|
|
|
|
3. **ConfigController** (`config.go`)
|
|
- Enhanced error context for configuration operations
|
|
- Improved restart operation error handling
|
|
- Better parsing error management
|
|
|
|
4. **LookupController** (`lookup.go`)
|
|
- Simplified error handling for lookup operations
|
|
- Consistent service error responses
|
|
|
|
5. **MembershipController** (`membership.go`)
|
|
- Enhanced authentication error handling
|
|
- Improved user management error responses
|
|
- Better UUID validation for user operations
|
|
|
|
6. **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)
|
|
```go
|
|
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
|
|
```go
|
|
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
|
|
```go
|
|
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. |