System Logger - Advanced Error Reporting Implementation

📄 General
← Back to Documentation
# System Logger - Advanced Error Reporting Implementation ## Overview Implemented a comprehensive SystemLogger entity with advanced error reporting mechanism for both Admin Panel (Filament) and Client UI (Web). This creates a ticket-based error tracking system with status management, assignment, and resolution workflows. ## Database Structure ### Migration: `create_system_logs_table` **Table**: `system_logs` #### Ticket Information: - `ticket_number` - Unique ticket identifier (ERR-YYYYMMDD-XXXXXX) - `status` - pending, being_resolved, resolved, not_resolved, ignored - `priority` - low, medium, high, critical - `severity` - info, warning, error, critical, emergency #### Error Classification: - `type` - payment, database, api, validation, exception - `category` - mypos, tremol, booking, user, etc. - `source` - controller, model, service, etc. #### Error Details: - `title` - Error title - `message` - Error message - `exception_class` - Exception class name - `exception_message` - Exception message - `file` - File where error occurred - `line` - Line number - `stack_trace` - Full stack trace #### Context Information: - `context` - JSON additional context - `request_data` - JSON request information - `user_data` - JSON user information - `metadata` - JSON additional metadata #### Related Entities: - `user_id` - User who encountered the error - `company_id` - Company context - `workspace_id` - Workspace context - `related_id` - Polymorphic related entity ID - `related_type` - Polymorphic related entity type #### Resolution Information: - `assigned_to` - User assigned to resolve - `assigned_at` - Assignment timestamp - `resolved_at` - Resolution timestamp - `resolved_by` - User who resolved - `resolution_notes` - Resolution notes #### Tracking: - `occurrence_count` - Number of occurrences - `first_occurred_at` - First occurrence - `last_occurred_at` - Last occurrence - `hash` - Hash for grouping similar errors #### Environment: - `environment` - production, staging, local - `url` - Request URL - `ip_address` - User IP - `user_agent` - User agent string #### Flags: - `is_critical` - Critical error flag - `is_notified` - Notification sent flag - `is_public` - Show to users flag ## Models & Services ### SystemLog Model **Location**: `app/Models/SystemLog.php` #### Key Features: - Auto-generates unique ticket numbers - Creates hash for grouping similar errors - Automatic duplicate detection and merging - Status management methods - Color helpers for UI display #### Methods: ```php // Static Methods SystemLog::logError(array $data): SystemLog SystemLog::generateTicketNumber(): string SystemLog::generateHash($log): string // Instance Methods $log->markAsBeingResolved(int $userId): void $log->markAsResolved(int $userId, ?string $notes): void $log->markAsNotResolved(?string $notes): void $log->ignore(): void $log->getShortStackTrace(int $lines = 5): ?string $log->getSeverityColor(): string $log->getStatusColor(): string $log->getPriorityColor(): string // Scopes SystemLog::pending() SystemLog::beingResolved() SystemLog::resolved() SystemLog::critical() SystemLog::unresolved() SystemLog::byType(string $type) SystemLog::byCategory(string $category) SystemLog::recent(int $days = 7) ``` ### SystemLogger Service **Location**: `app/Services/SystemLogger.php` #### Methods: ```php // Payment Errors SystemLogger::logPaymentError( Throwable|array $error, string $category = 'payment', ?int $userId = null, ?array $context = [] ): SystemLog // MyPOS Errors SystemLogger::logMyPOSError( array $errorDetails, int $reservationId, ?int $paymentId = null, ?int $userId = null ): SystemLog // General Exceptions SystemLogger::logException( Throwable $exception, string $type = 'exception', ?string $category = null, ?int $userId = null, ?array $context = [] ): SystemLog // Database Errors SystemLogger::logDatabaseError( Throwable $exception, ?string $query = null, ?array $bindings = [] ): SystemLog // API Errors SystemLogger::logAPIError( string $service, string $endpoint, $response, ?array $requestData = [] ): SystemLog // Validation Errors SystemLogger::logValidationError( array $errors, string $context = 'form_validation' ): SystemLog ``` ## Admin Panel Integration ### Filament Resource **Location**: `app/Filament/App/Resources/SystemLogResource.php` #### Features: - **Navigation Badge**: Shows count of unresolved errors - **Dynamic Badge Color**: Changes based on error count - **Comprehensive Table**: All error information at a glance - **Advanced Filters**: Status, priority, severity, type, date range - **Quick Actions**: Assign, Resolve, Ignore - **Bulk Actions**: Mass resolve or ignore - **Detailed View**: Complete error information with infolist #### Table Columns: - Ticket Number (searchable, copyable) - Status Badge (color-coded) - Priority Badge (color-coded) - Severity Badge (color-coded) - Type Badge - Category - Title (with tooltip) - Occurrence Count - User - Assigned To - Critical Flag - Created At - Last Occurred At #### Filters: - Status (multiple select) - Priority (multiple select) - Severity (multiple select) - Type (multiple select) - Critical Only (ternary) - Date Range #### Actions: - **View**: Full error details - **Edit**: Modify error properties - **Assign**: Assign to team member - **Resolve**: Mark as resolved with notes - **Ignore**: Ignore error #### Tabs: - All - Unresolved (with badge) - Pending (with badge) - Being Resolved (with badge) - Resolved (with badge) - Critical (with badge) - Payment Errors (with badge) - Last 7 Days ### Infolist Sections: 1. **Ticket Information**: Status, priority, severity, occurrences 2. **Error Details**: Title, message, type, category 3. **Exception Details**: Class, message, file, line, stack trace 4. **Context Data**: JSON formatted context 5. **Request Data**: JSON formatted request info 6. **User Information**: User details, IP, user agent 7. **Assignment & Resolution**: Assignment and resolution tracking 8. **Environment**: Environment, URL ## Client UI Integration ### Controller **Location**: `app/Http/Controllers/ErrorReportController.php` #### Routes: ```php Route::get('/client/error-reports', [ErrorReportController::class, 'index']) ->name('client.error-reports'); Route::get('/client/error-reports/{ticket}', [ErrorReportController::class, 'show']) ->name('client.error-reports.show'); Route::post('/client/error-reports/{ticket}/feedback', [ErrorReportController::class, 'feedback']) ->name('client.error-reports.feedback'); ``` #### Methods: - `index()` - List user's public errors with filters and stats - `show($ticketNumber)` - Show detailed error report - `feedback($ticketNumber)` - Submit user feedback on error ### Views **Location**: `resources/views/web/client/` #### error-reports.blade.php: - **Statistics Cards**: Total, Pending, Resolved, Critical - **Filters**: Status, Type, Severity - **Error List**: Card-based layout with badges - **Pagination**: Laravel pagination - **Empty State**: Friendly message when no errors #### error-report-details.blade.php (to be created): - **Ticket Header**: Ticket number, status, priority - **Error Information**: Title, message, details - **Timeline**: Error occurrences - **Resolution Status**: Current status and notes - **Feedback Form**: User can provide feedback - **Related Information**: Linked booking/transaction ## Usage Examples ### 1. Log MyPOS Payment Error ```php use App\Services\SystemLogger; // In CheckoutController SystemLogger::logMyPOSError( $errorDetails, $reservation->id, $payment->id, auth()->id() ); ``` ### 2. Log General Exception ```php try { // Some code } catch (Exception $e) { SystemLogger::logException( $e, 'payment', 'mypos', auth()->id(), ['reservation_id' => $reservationId] ); } ``` ### 3. Log API Error ```php SystemLogger::logAPIError( 'stripe', '/v1/charges', $response, ['amount' => 100] ); ``` ### 4. Log Database Error ```php try { DB::table('users')->insert($data); } catch (QueryException $e) { SystemLogger::logDatabaseError( $e, $e->getSql(), $e->getBindings() ); } ``` ## Automatic Error Grouping The system automatically groups similar errors using a hash: - Same exception class - Same file - Same line - Same type When a similar error occurs within 24 hours: - Increments `occurrence_count` - Updates `last_occurred_at` - Merges context data - Keeps original ticket number ## Workflow ### 1. Error Occurs - Exception thrown or error detected - SystemLogger captures error - Ticket created with unique number - Status set to 'pending' ### 2. Admin Reviews - Admin sees error in Filament panel - Reviews error details - Assigns to team member - Status changes to 'being_resolved' ### 3. Resolution - Team member investigates - Fixes underlying issue - Marks as resolved with notes - Status changes to 'resolved' ### 4. User Notification - User sees error in their dashboard - Can view details and status - Can provide feedback - Notified when resolved ## Benefits ### For Admins: - ✅ Centralized error tracking - ✅ Ticket-based workflow - ✅ Assignment and resolution tracking - ✅ Error grouping and deduplication - ✅ Comprehensive error details - ✅ Filtering and searching - ✅ Bulk operations ### For Users: - ✅ Transparency on errors - ✅ Status tracking - ✅ Ability to provide feedback - ✅ Professional error handling - ✅ Clear communication ### For Developers: - ✅ Easy error logging - ✅ Automatic context capture - ✅ Stack traces and debugging info - ✅ Environment tracking - ✅ Request/response logging ## Security & Privacy - Sensitive data (passwords, card numbers, CVV) never logged - User data sanitized - Admin-only technical details - Public flag controls user visibility - Soft deletes for audit trail ## Next Steps 1. **Run Migration**: ```bash php artisan migrate ``` 2. **Add Routes** to `routes/web.php`: ```php Route::middleware(['auth'])->group(function () { Route::get('/client/error-reports', [ErrorReportController::class, 'index']) ->name('client.error-reports'); Route::get('/client/error-reports/{ticket}', [ErrorReportController::class, 'show']) ->name('client.error-reports.show'); Route::post('/client/error-reports/{ticket}/feedback', [ErrorReportController::class, 'feedback']) ->name('client.error-reports.feedback'); }); ``` 3. **Add to Client Navigation**: Update client layout sidebar with link to error reports 4. **Create Error Report Details View**: Create `error-report-details.blade.php` view 5. **Test Error Logging**: Trigger test errors and verify logging ## Files Created 1. **Migration**: `database/migrations/2025_01_24_140800_create_system_logs_table.php` 2. **Model**: `app/Models/SystemLog.php` 3. **Service**: `app/Services/SystemLogger.php` 4. **Admin Resource**: `app/Filament/App/Resources/SystemLogResource.php` 5. **Admin Pages**: `app/Filament/App/Resources/SystemLogResource/Pages/` - `ListSystemLogs.php` - `CreateSystemLog.php` - `EditSystemLog.php` - `ViewSystemLog.php` 6. **Controller**: `app/Http/Controllers/ErrorReportController.php` 7. **View**: `resources/views/web/client/error-reports.blade.php` ## Success Indicators ✅ Migration created ✅ Model with relationships and scopes ✅ Service class for easy logging ✅ Admin panel resource with full CRUD ✅ Client UI for user error reports ✅ Automatic error grouping ✅ Status workflow management ✅ Assignment and resolution tracking ✅ Comprehensive error capture ✅ Security and privacy controls This implementation provides enterprise-level error tracking and reporting comparable to services like Sentry, Bugsnag, or Rollbar, but fully integrated into your application with custom workflows!