# 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!