Mhdeusi commited on
Commit
0675ff5
·
verified ·
1 Parent(s): 3c2e511

Create js/utils/error_logger.js

Browse files
Files changed (1) hide show
  1. js/utils/error_logger.js +132 -0
js/utils/error_logger.js ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class ErrorLogger {
2
+ constructor() {
3
+ this.logKey = 'app_error_log';
4
+ this.maxLogs = 100;
5
+ this.enabled = true;
6
+ }
7
+
8
+ init() {
9
+ // پاک کردن لاگ‌های قدیمی در صورت نیاز
10
+ this.cleanupOldLogs();
11
+
12
+ // ثبت خطاهای全局
13
+ window.addEventListener('error', (event) => {
14
+ this.logError({
15
+ type: 'global_error',
16
+ message: event.message,
17
+ filename: event.filename,
18
+ lineno: event.lineno,
19
+ colno: event.colno,
20
+ error: event.error?.toString(),
21
+ timestamp: new Date().toISOString()
22
+ });
23
+ });
24
+
25
+ // ثبت rejectionهای catch نشده
26
+ window.addEventListener('unhandledrejection', (event) => {
27
+ this.logError({
28
+ type: 'unhandled_rejection',
29
+ reason: event.reason?.toString(),
30
+ timestamp: new Date().toISOString()
31
+ });
32
+ });
33
+
34
+ console.log('✅ Error logger initialized');
35
+ }
36
+
37
+ logError(errorData) {
38
+ if (!this.enabled) return;
39
+
40
+ try {
41
+ const logs = this.getLogs();
42
+ logs.push({
43
+ ...errorData,
44
+ id: this.generateId(),
45
+ userAgent: navigator.userAgent,
46
+ url: window.location.href
47
+ });
48
+
49
+ // محدود کردن تعداد لاگ‌ها
50
+ if (logs.length > this.maxLogs) {
51
+ logs.splice(0, logs.length - this.maxLogs);
52
+ }
53
+
54
+ localStorage.setItem(this.logKey, JSON.stringify(logs));
55
+
56
+ // همچنین در کنسول نمایش داده شود
57
+ console.error('🔴 Error logged:', errorData);
58
+ } catch (error) {
59
+ console.error('Failed to log error:', error);
60
+ }
61
+ }
62
+
63
+ getLogs() {
64
+ try {
65
+ const logs = localStorage.getItem(this.logKey);
66
+ return logs ? JSON.parse(logs) : [];
67
+ } catch (error) {
68
+ console.error('Failed to get logs:', error);
69
+ return [];
70
+ }
71
+ }
72
+
73
+ clearLogs() {
74
+ try {
75
+ localStorage.removeItem(this.logKey);
76
+ console.log('✅ Error logs cleared');
77
+ } catch (error) {
78
+ console.error('Failed to clear logs:', error);
79
+ }
80
+ }
81
+
82
+ exportLogs() {
83
+ const logs = this.getLogs();
84
+ const dataStr = JSON.stringify(logs, null, 2);
85
+ const dataBlob = new Blob([dataStr], { type: 'application/json' });
86
+
87
+ const url = URL.createObjectURL(dataBlob);
88
+ const link = document.createElement('a');
89
+ link.href = url;
90
+ link.download = `error_logs_${new Date().toISOString().split('T')[0]}.json`;
91
+ link.click();
92
+
93
+ URL.revokeObjectURL(url);
94
+ }
95
+
96
+ cleanupOldLogs() {
97
+ const logs = this.getLogs();
98
+ const oneWeekAgo = new Date();
99
+ oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
100
+
101
+ const filteredLogs = logs.filter(log =>
102
+ new Date(log.timestamp) > oneWeekAgo
103
+ );
104
+
105
+ if (filteredLogs.length !== logs.length) {
106
+ localStorage.setItem(this.logKey, JSON.stringify(filteredLogs));
107
+ }
108
+ }
109
+
110
+ generateId() {
111
+ return Date.now().toString(36) + Math.random().toString(36).substr(2);
112
+ }
113
+
114
+ enable() {
115
+ this.enabled = true;
116
+ }
117
+
118
+ disable() {
119
+ this.enabled = false;
120
+ }
121
+ }
122
+
123
+ // ایجاد نمونه全局
124
+ const errorLogger = new ErrorLogger();
125
+
126
+ // قرار دادن در全局 برای دسترسی از کنسول
127
+ window.errorLogger = errorLogger;
128
+
129
+ // راه‌اندازی هنگام بارگذاری
130
+ document.addEventListener('DOMContentLoaded', () => {
131
+ errorLogger.init();
132
+ });