File size: 3,829 Bytes
0675ff5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
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();
}); |