提交 | 用户 | age
|
5f033b
|
1 |
import dayjs from 'dayjs'; |
S |
2 |
// type logger = { |
89d7b1
|
3 |
// level: string; // 默认为DEBUG级别 |
S |
4 |
// setLevel(newLevel:string): void; |
|
5 |
// shouldLog(level: string): boolean; |
|
6 |
// formatStack(stack: string): string; |
|
7 |
// log(level: string, message: string, error?: Error): void; |
|
8 |
// debug(message: string): void; |
|
9 |
// info(message: string): void; |
|
10 |
// warn(message: string): void; |
|
11 |
// error(message: string, error?: Error): void; |
|
12 |
// fatal(message: string, error?: Error): void; |
|
13 |
// } |
|
14 |
|
5f033b
|
15 |
type Level = 'LOG' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'FATAL'; |
28c484
|
16 |
type LogObject = { |
S |
17 |
level: Level; |
|
18 |
title: any; |
|
19 |
message?: any; |
|
20 |
error?: Error; |
|
21 |
}; |
89d7b1
|
22 |
|
S |
23 |
class Logger { |
807478
|
24 |
private static level = 'LOG'; // 默认为LOG级别 |
S |
25 |
private static logPaletteColor = { |
5f033b
|
26 |
default: '#78909C', |
S |
27 |
LOG: '#78909C', |
|
28 |
INFO: '#5F9FD7', |
|
29 |
WARN: '#DC5F00', |
|
30 |
ERROR: '#f23232', |
|
31 |
FATAL: '#ff5c93', |
|
32 |
TIME: '#9575CD', |
|
33 |
}; |
|
34 |
static logEmoji = { |
|
35 |
default: '📌', |
|
36 |
LOG: '🌈', |
|
37 |
INFO: '📘', |
|
38 |
WARN: '⚠️', |
|
39 |
ERROR: '⛔', |
|
40 |
FATAL: '🎄', |
|
41 |
TIME: '⏰', |
|
42 |
}; |
28c484
|
43 |
|
5f033b
|
44 |
|
807478
|
45 |
private static getLogPaletteCss(level: Level) { |
5f033b
|
46 |
return `background-color: ${this.logPaletteColor[level] || this.logPaletteColor['default']}; color: #fff; padding: 2px 4px; border-radius: 4px;}; margin-right: 10px;`; |
S |
47 |
} |
89d7b1
|
48 |
|
S |
49 |
static setLevel(newLevel: Level) { |
|
50 |
this.level = newLevel; |
|
51 |
} |
|
52 |
|
|
53 |
// 根据日志等级判断是否应该打印日志 |
807478
|
54 |
private static shouldLog(level: Level) { |
5f033b
|
55 |
const levels = ['LOG', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']; |
89d7b1
|
56 |
return levels.indexOf(level) >= levels.indexOf(this.level); |
S |
57 |
} |
|
58 |
|
807478
|
59 |
private static formatStack(stack: string | undefined) { |
89d7b1
|
60 |
if (!stack) return ''; |
S |
61 |
// 格式化错误堆栈的逻辑 |
|
62 |
return stack |
|
63 |
.split('\n') |
|
64 |
.map((line) => ` at ${line}`) |
|
65 |
.join('\n'); |
|
66 |
} |
|
67 |
|
28c484
|
68 |
private static logger(infoObject: LogObject) { |
S |
69 |
let { level, title, message, error } = infoObject; |
89d7b1
|
70 |
if (!this.shouldLog(level)) { |
S |
71 |
return; |
|
72 |
} |
5f033b
|
73 |
// const timestamp = new Date().toISOString(); |
807478
|
74 |
const timestamp = dayjs().format('YYYY-MM-DD HH:mm:ss SSS'); |
89d7b1
|
75 |
const stack = error ? error.stack : ''; |
5f033b
|
76 |
|
S |
77 |
let formattedMessage = `%c${level}%c${this.logEmoji['TIME']}${timestamp}${this.logEmoji['TIME']}%c${stack}`; |
28c484
|
78 |
if (typeof title === 'string') { |
S |
79 |
title = this.logEmoji[level] + ' ' + title + ' ' + this.logEmoji[level]; |
5f033b
|
80 |
} |
89d7b1
|
81 |
|
S |
82 |
// 格式化错误堆栈 |
28c484
|
83 |
if (error&&error.stack) { |
89d7b1
|
84 |
formattedMessage += `\n${this.formatStack(error.stack)}`; |
S |
85 |
} |
|
86 |
|
|
87 |
switch (level) { |
5f033b
|
88 |
case 'LOG': |
S |
89 |
console.log( |
|
90 |
formattedMessage, |
|
91 |
this.getLogPaletteCss(level), |
|
92 |
this.getLogPaletteCss('FATAL'), |
|
93 |
'', |
28c484
|
94 |
title??'', |
S |
95 |
message??'', |
5f033b
|
96 |
); |
S |
97 |
break; |
89d7b1
|
98 |
case 'DEBUG': |
5f033b
|
99 |
console.debug( |
S |
100 |
formattedMessage, |
|
101 |
this.getLogPaletteCss(level), |
|
102 |
this.getLogPaletteCss('FATAL'), |
|
103 |
'', |
28c484
|
104 |
title??'', |
S |
105 |
message??'', |
5f033b
|
106 |
); |
89d7b1
|
107 |
break; |
S |
108 |
case 'INFO': |
5f033b
|
109 |
console.info( |
S |
110 |
formattedMessage, |
|
111 |
this.getLogPaletteCss(level), |
|
112 |
this.getLogPaletteCss('FATAL'), |
|
113 |
'', |
28c484
|
114 |
title??'', |
S |
115 |
message??'', |
5f033b
|
116 |
); |
89d7b1
|
117 |
break; |
S |
118 |
case 'WARN': |
5f033b
|
119 |
console.warn( |
S |
120 |
formattedMessage, |
|
121 |
this.getLogPaletteCss(level), |
|
122 |
this.getLogPaletteCss('FATAL'), |
|
123 |
'', |
28c484
|
124 |
title??'', |
S |
125 |
message??'', |
5f033b
|
126 |
); |
89d7b1
|
127 |
break; |
S |
128 |
case 'ERROR': |
5f033b
|
129 |
console.error( |
S |
130 |
formattedMessage, |
|
131 |
this.getLogPaletteCss(level), |
|
132 |
this.getLogPaletteCss('FATAL'), |
|
133 |
'', |
28c484
|
134 |
title??'', |
S |
135 |
message??'', |
5f033b
|
136 |
); |
S |
137 |
break; |
89d7b1
|
138 |
case 'FATAL': |
5f033b
|
139 |
console.error( |
S |
140 |
formattedMessage, |
28c484
|
141 |
title??'', |
S |
142 |
message??'', |
5f033b
|
143 |
this.getLogPaletteCss(level), |
S |
144 |
this.getLogPaletteCss('FATAL'), |
|
145 |
'', |
|
146 |
); |
89d7b1
|
147 |
break; |
S |
148 |
default: |
5f033b
|
149 |
console.log( |
S |
150 |
formattedMessage, |
|
151 |
this.getLogPaletteCss(level), |
|
152 |
this.getLogPaletteCss('FATAL'), |
|
153 |
'', |
28c484
|
154 |
title??'', |
S |
155 |
message??'', |
5f033b
|
156 |
); |
89d7b1
|
157 |
} |
S |
158 |
} |
|
159 |
|
28c484
|
160 |
static log(...message: any[]) { |
S |
161 |
this.logger({ |
|
162 |
level: 'LOG', |
|
163 |
title: message[0], |
|
164 |
message: message[1] |
|
165 |
}); |
5f033b
|
166 |
} |
28c484
|
167 |
// static log(message: string | object) { |
S |
168 |
// this.logger('LOG', message); |
|
169 |
// } |
|
170 |
static debug(...message: any[]) { |
|
171 |
this.logger({ |
|
172 |
level: 'DEBUG', |
|
173 |
title: message[0], |
|
174 |
message: message[1] |
|
175 |
}); |
89d7b1
|
176 |
} |
S |
177 |
|
28c484
|
178 |
static info(...message: any[]) { |
S |
179 |
this.logger({ |
|
180 |
level: 'INFO', |
|
181 |
title: message[0], |
|
182 |
message: message[1] |
|
183 |
}); |
89d7b1
|
184 |
} |
S |
185 |
|
28c484
|
186 |
static warn(...message: any[]) { |
S |
187 |
this.logger({ |
|
188 |
level: 'WARN', |
|
189 |
title: message[0], |
|
190 |
message: message[1] |
|
191 |
}); |
89d7b1
|
192 |
} |
S |
193 |
|
28c484
|
194 |
static error(error: Error,...message: any[]) { |
S |
195 |
this.logger({ |
|
196 |
level: 'ERROR', |
|
197 |
title: message[0], |
|
198 |
message: message[1], |
|
199 |
error, |
|
200 |
}); |
89d7b1
|
201 |
} |
S |
202 |
|
28c484
|
203 |
static fatal(error: Error,...message: any[]) { |
S |
204 |
this.logger({ |
|
205 |
level: 'FATAL', |
|
206 |
title: message[0], |
|
207 |
message: message[1], |
|
208 |
error |
|
209 |
}); |
89d7b1
|
210 |
} |
S |
211 |
} |
|
212 |
|
|
213 |
// 生产环境中设置日志等级 |
|
214 |
if (process.env.NODE_ENV === 'production') { |
|
215 |
Logger.setLevel('WARN'); |
|
216 |
} |
|
217 |
|
|
218 |
// // 使用示例 |
|
219 |
// Logger.info('Application is starting...'); |
|
220 |
// Logger.error('Failed to load user data', new Error('Network Error')); |
|
221 |
|
|
222 |
export default Logger; |