Sanakey
5 天以前 2af71bcf522c485ea005184c977986374a7dcc4a
提交 | 用户 | 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;