class ErrorLogger { constructor() { this.logKey = 'app_error_log'; this.maxLogs = 100; this.enabled = true; } init() { // پاک کردن لاگ‌های قدیمی در صورت نیاز this.cleanupOldLogs(); // ثبت خطاهای全局 window.addEventListener('error', (event) => { this.logError({ type: 'global_error', message: event.message, filename: event.filename, lineno: event.lineno, colno: event.colno, error: event.error?.toString(), timestamp: new Date().toISOString() }); }); // ثبت rejectionهای catch نشده window.addEventListener('unhandledrejection', (event) => { this.logError({ type: 'unhandled_rejection', reason: event.reason?.toString(), timestamp: new Date().toISOString() }); }); console.log('✅ Error logger initialized'); } logError(errorData) { if (!this.enabled) return; try { const logs = this.getLogs(); logs.push({ ...errorData, id: this.generateId(), userAgent: navigator.userAgent, url: window.location.href }); // محدود کردن تعداد لاگ‌ها if (logs.length > this.maxLogs) { logs.splice(0, logs.length - this.maxLogs); } localStorage.setItem(this.logKey, JSON.stringify(logs)); // همچنین در کنسول نمایش داده شود console.error('🔴 Error logged:', errorData); } catch (error) { console.error('Failed to log error:', error); } } getLogs() { try { const logs = localStorage.getItem(this.logKey); return logs ? JSON.parse(logs) : []; } catch (error) { console.error('Failed to get logs:', error); return []; } } clearLogs() { try { localStorage.removeItem(this.logKey); console.log('✅ Error logs cleared'); } catch (error) { console.error('Failed to clear logs:', error); } } exportLogs() { const logs = this.getLogs(); const dataStr = JSON.stringify(logs, null, 2); const dataBlob = new Blob([dataStr], { type: 'application/json' }); const url = URL.createObjectURL(dataBlob); const link = document.createElement('a'); link.href = url; link.download = `error_logs_${new Date().toISOString().split('T')[0]}.json`; link.click(); URL.revokeObjectURL(url); } cleanupOldLogs() { const logs = this.getLogs(); const oneWeekAgo = new Date(); oneWeekAgo.setDate(oneWeekAgo.getDate() - 7); const filteredLogs = logs.filter(log => new Date(log.timestamp) > oneWeekAgo ); if (filteredLogs.length !== logs.length) { localStorage.setItem(this.logKey, JSON.stringify(filteredLogs)); } } generateId() { return Date.now().toString(36) + Math.random().toString(36).substr(2); } enable() { this.enabled = true; } disable() { this.enabled = false; } } // ایجاد نمونه全局 const errorLogger = new ErrorLogger(); // قرار دادن در全局 برای دسترسی از کنسول window.errorLogger = errorLogger; // راه‌اندازی هنگام بارگذاری document.addEventListener('DOMContentLoaded', () => { errorLogger.init(); });