react-native-fxview 1.0.2 → 1.0.3-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FXView.js +9 -5
- package/FXView.tsx +6 -5
- package/FXViewCategoryController.d.ts +100 -0
- package/FXViewCategoryController.js +270 -0
- package/FXViewManager.d.ts +10 -0
- package/FXViewManager.js +40 -28
- package/FXViewManager.ts +45 -28
- package/index.d.ts +2 -3
- package/index.js +4 -6
- package/index.ts +2 -3
- package/logger/FXLogger-README.md +248 -0
- package/logger/FXLogger.d.ts +106 -0
- package/logger/FXLogger.js +237 -0
- package/logger/FXLogger.ts +281 -0
- package/package.json +9 -1
- package/queue/PriorityQueue.d.ts +153 -0
- package/queue/PriorityQueue.js +325 -0
- package/queue/PriorityQueue.ts +367 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# FX Logger - 调试日志系统
|
|
2
|
+
|
|
3
|
+
FX Logger 是一个专为 React Native 项目设计的调试日志系统,提供了丰富的日志功能和灵活的配置选项。
|
|
4
|
+
|
|
5
|
+
## 功能特点
|
|
6
|
+
|
|
7
|
+
- **调试模式控制**: 仅在调试模式下输出日志,避免生产环境日志泄露
|
|
8
|
+
- **时间戳支持**: 自动添加完整时间戳(年月日时分秒毫秒),便于追踪时间线
|
|
9
|
+
- **多级别日志**: 支持 debug、info、warn、error 四个日志级别,每个级别有不同颜色标识
|
|
10
|
+
- **标签分类**: 支持按标签分类日志,便于筛选和定位问题
|
|
11
|
+
- **日志分组**: 支持日志分组功能,便于组织相关日志
|
|
12
|
+
- **性能计时**: 内置性能计时功能,方便性能分析
|
|
13
|
+
- **表格输出**: 支持表格形式输出结构化数据
|
|
14
|
+
- **灵活配置**: 可配置的日志级别、前缀、时间戳等
|
|
15
|
+
- **级别颜色**: 不同日志级别自动分配颜色标识,提升可读性
|
|
16
|
+
|
|
17
|
+
## 快速开始
|
|
18
|
+
|
|
19
|
+
### 1. 导入 Logger
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import logger from "./FXLogger";
|
|
23
|
+
|
|
24
|
+
// 或者从主入口导入
|
|
25
|
+
import { logger } from "./index";
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 2. 基本使用
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
// 调试日志(仅在调试模式下显示)
|
|
32
|
+
logger.debug("MyComponent", "This is a debug message");
|
|
33
|
+
|
|
34
|
+
// 信息日志
|
|
35
|
+
logger.info("MyComponent", "This is an info message");
|
|
36
|
+
|
|
37
|
+
// 警告日志
|
|
38
|
+
logger.warn("MyComponent", "This is a warning message");
|
|
39
|
+
|
|
40
|
+
// 错误日志
|
|
41
|
+
logger.error("MyComponent", "This is an error message");
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 3. 带参数日志
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
logger.debug("MyComponent", "User action:", {
|
|
48
|
+
action: "click",
|
|
49
|
+
target: "button",
|
|
50
|
+
timestamp: Date.now()
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
logger.info("MyComponent", "Multiple", "arguments", "supported");
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 4. 日志分组
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
logger.group("UserFlow", "用户操作流程");
|
|
60
|
+
logger.debug("UserFlow", "步骤1: 用户点击登录按钮");
|
|
61
|
+
logger.debug("UserFlow", "步骤2: 验证用户凭证");
|
|
62
|
+
logger.info("UserFlow", "用户登录流程完成");
|
|
63
|
+
logger.groupEnd();
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 5. 性能计时
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
logger.time("Performance", "数据加载");
|
|
70
|
+
// 执行一些操作
|
|
71
|
+
logger.timeEnd("Performance", "数据加载");
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 6. 表格输出
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
const users = [
|
|
78
|
+
{ id: 1, name: "张三", age: 25, city: "北京" },
|
|
79
|
+
{ id: 2, name: "李四", age: 30, city: "上海" },
|
|
80
|
+
];
|
|
81
|
+
logger.table("UserService", users);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 7. 断言日志
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const userAge = 20;
|
|
88
|
+
logger.assert("Validation", userAge >= 18, "用户必须年满18岁");
|
|
89
|
+
|
|
90
|
+
const isLoggedIn = true;
|
|
91
|
+
logger.assert("AuthService", isLoggedIn, "用户必须已登录");
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 8. 追踪日志
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
function deepFunction() {
|
|
98
|
+
logger.trace("MyComponent", "Current call stack");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function middleFunction() {
|
|
102
|
+
deepFunction();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function topFunction() {
|
|
106
|
+
middleFunction();
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 配置选项
|
|
111
|
+
|
|
112
|
+
### 获取和设置配置
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// 获取当前配置
|
|
116
|
+
const config = logger.getConfig();
|
|
117
|
+
console.log("当前配置:", config);
|
|
118
|
+
|
|
119
|
+
// 修改配置
|
|
120
|
+
logger.configure({
|
|
121
|
+
debug: true, // 启用调试模式
|
|
122
|
+
level: FXLogLevel.DEBUG, // 设置日志级别
|
|
123
|
+
showTimestamp: true, // 显示时间戳
|
|
124
|
+
showTags: true, // 显示标签
|
|
125
|
+
prefix: "[MY-APP]" // 设置前缀
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 日志级别
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
export enum FXLogLevel {
|
|
133
|
+
DEBUG = 0, // 调试级别(最详细)
|
|
134
|
+
INFO = 1, // 信息级别
|
|
135
|
+
WARN = 2, // 警告级别
|
|
136
|
+
ERROR = 3, // 错误级别
|
|
137
|
+
SILENT = 4 // 静默模式(不输出任何日志)
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 级别颜色标识
|
|
142
|
+
|
|
143
|
+
FX Logger 为不同日志级别自动分配颜色标识:
|
|
144
|
+
|
|
145
|
+
- **DEBUG** 🔵 蓝色 - 调试信息
|
|
146
|
+
- **INFO** 🟢 绿色 - 一般信息
|
|
147
|
+
- **WARN** 🟡 黄色 - 警告信息
|
|
148
|
+
- **ERROR** 🔴 红色 - 错误信息
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
logger.debug("MyComponent", "调试信息"); // 🔵 [DEBUG]
|
|
152
|
+
logger.info("MyComponent", "一般信息"); // 🟢 [INFO]
|
|
153
|
+
logger.warn("MyComponent", "警告信息"); // 🟡 [WARN]
|
|
154
|
+
logger.error("MyComponent", "错误信息"); // 🔴 [ERROR]
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 时间戳格式
|
|
158
|
+
|
|
159
|
+
时间戳格式为:`YYYY-MM-DD HH:mm:ss.SSS`
|
|
160
|
+
|
|
161
|
+
示例:`[2024-02-12 14:32:15.123]`
|
|
162
|
+
|
|
163
|
+
包含完整的年月日信息,便于长期日志追踪和分析。
|
|
164
|
+
|
|
165
|
+
## 环境检测
|
|
166
|
+
|
|
167
|
+
FX Logger 支持自动环境检测,能够智能识别当前运行环境:
|
|
168
|
+
|
|
169
|
+
- **开发环境**: 自动启用调试模式,显示所有级别日志
|
|
170
|
+
- **生产环境**: 自动禁用调试模式,只显示错误级别日志
|
|
171
|
+
|
|
172
|
+
检测顺序:
|
|
173
|
+
1. React Native `__DEV__` 变量
|
|
174
|
+
2. Node.js `process.env.NODE_ENV`
|
|
175
|
+
3. 全局 `NODE_ENV` 变量
|
|
176
|
+
4. 浏览器 `window.__DEV__`
|
|
177
|
+
|
|
178
|
+
## 使用示例
|
|
179
|
+
|
|
180
|
+
### 基本示例
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
import logger from "./FXLogger";
|
|
184
|
+
|
|
185
|
+
// 开发环境输出所有日志
|
|
186
|
+
logger.debug("AuthService", "用户登录开始");
|
|
187
|
+
logger.info("AuthService", "用户登录成功");
|
|
188
|
+
logger.error("AuthService", "用户登录失败");
|
|
189
|
+
|
|
190
|
+
// 生产环境只输出错误日志
|
|
191
|
+
logger.debug("AuthService", "这条不会显示"); // ❌ 不显示
|
|
192
|
+
logger.error("AuthService", "这条会显示"); // ✅ 显示
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 输出示例
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
// 开发环境
|
|
199
|
+
[FX-DEV][2024-02-12 14:32:15.123][🔵DEBUG][AuthService] 用户登录开始
|
|
200
|
+
[FX-DEV][2024-02-12 14:32:15.124][🟢INFO][AuthService] 用户登录成功
|
|
201
|
+
[FX-DEV][2024-02-12 14:32:15.125][🔴ERROR][AuthService] 用户登录失败
|
|
202
|
+
|
|
203
|
+
// 生产环境
|
|
204
|
+
[FX-PROD][2024-02-12 14:32:15.125][🔴ERROR][AuthService] 用户登录失败
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## API 参考
|
|
208
|
+
|
|
209
|
+
### Logger 方法
|
|
210
|
+
|
|
211
|
+
- `debug(tag: string, message: string, ...args: any[]): void` - 调试日志
|
|
212
|
+
- `info(tag: string, message: string, ...args: any[]): void` - 信息日志
|
|
213
|
+
- `warn(tag: string, message: string, ...args: any[]): void` - 警告日志
|
|
214
|
+
- `error(tag: string, message: string, ...args: any[]): void` - 错误日志
|
|
215
|
+
- `group(tag: string, label?: string): void` - 开始日志分组
|
|
216
|
+
- `groupEnd(): void` - 结束日志分组
|
|
217
|
+
- `table(tag: string, data: any): void` - 表格形式输出数据
|
|
218
|
+
- `time(tag: string, label: string): void` - 开始计时
|
|
219
|
+
- `timeEnd(tag: string, label: string): void` - 结束计时
|
|
220
|
+
- `assert(tag: string, condition: any, message?: string): void` - 断言日志
|
|
221
|
+
- `trace(tag: string, message: string): void` - 追踪日志
|
|
222
|
+
- `getConfig(): FXLoggerConfig` - 获取当前配置
|
|
223
|
+
- `configure(config: Partial<FXLoggerConfig>): void` - 配置 Logger
|
|
224
|
+
- `enableDebug(): void` - 启用调试模式
|
|
225
|
+
- `disableDebug(): void` - 禁用调试模式
|
|
226
|
+
|
|
227
|
+
## 注意事项
|
|
228
|
+
|
|
229
|
+
1. **生产环境**: 默认只显示错误级别日志,避免敏感信息泄露
|
|
230
|
+
2. **时间戳**: 包含完整的年月日信息,便于长期日志分析
|
|
231
|
+
3. **级别颜色**: 不同级别自动分配颜色,提升日志可读性
|
|
232
|
+
4. **标签功能**: 标签参数仍然存在,用于分类标识,但不添加颜色装饰
|
|
233
|
+
5. **性能**: 在生产环境中,低级别日志会被自动过滤,不影响性能
|
|
234
|
+
|
|
235
|
+
## 更新日志
|
|
236
|
+
|
|
237
|
+
### v2.1.0
|
|
238
|
+
- ✅ 添加级别颜色标识功能
|
|
239
|
+
- ✅ 时间戳格式改为包含年月日
|
|
240
|
+
- ✅ 移除标签颜色功能,简化输出
|
|
241
|
+
- ✅ 优化环境检测逻辑
|
|
242
|
+
|
|
243
|
+
### v2.0.0
|
|
244
|
+
- ✅ 添加自动环境检测功能
|
|
245
|
+
- ✅ 开发环境默认启用调试模式
|
|
246
|
+
- ✅ 生产环境默认禁用调试模式
|
|
247
|
+
|
|
248
|
+
FX Logger 让您的 React Native 项目调试更加高效和直观!🚀
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日志级别枚举
|
|
3
|
+
*/
|
|
4
|
+
export declare enum FXLogLevel {
|
|
5
|
+
DEBUG = 0,// 调试级别(最详细)
|
|
6
|
+
INFO = 1,// 信息级别
|
|
7
|
+
WARN = 2,// 警告级别
|
|
8
|
+
ERROR = 3,// 错误级别
|
|
9
|
+
SILENT = 4
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Logger 配置接口
|
|
13
|
+
*/
|
|
14
|
+
export interface FXLoggerConfig {
|
|
15
|
+
debug: boolean;
|
|
16
|
+
level: FXLogLevel;
|
|
17
|
+
showTimestamp: boolean;
|
|
18
|
+
showTags: boolean;
|
|
19
|
+
prefix: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* FX Logger - 专为 React Native 项目设计的调试日志系统
|
|
23
|
+
* 提供丰富的日志功能和灵活的配置选项
|
|
24
|
+
*/
|
|
25
|
+
export declare class FXLogger {
|
|
26
|
+
private static instance;
|
|
27
|
+
private config;
|
|
28
|
+
/**
|
|
29
|
+
* 私有构造函数,实现单例模式
|
|
30
|
+
*/
|
|
31
|
+
private constructor();
|
|
32
|
+
/**
|
|
33
|
+
* 获取单例实例
|
|
34
|
+
*/
|
|
35
|
+
static getInstance(): FXLogger;
|
|
36
|
+
/**
|
|
37
|
+
* 检测当前是否为开发环境
|
|
38
|
+
*/
|
|
39
|
+
private isDevelopmentEnvironment;
|
|
40
|
+
/**
|
|
41
|
+
* 获取当前配置
|
|
42
|
+
*/
|
|
43
|
+
getConfig(): FXLoggerConfig;
|
|
44
|
+
/**
|
|
45
|
+
* 配置 Logger
|
|
46
|
+
*/
|
|
47
|
+
configure(config: Partial<FXLoggerConfig>): void;
|
|
48
|
+
/**
|
|
49
|
+
* 启用调试模式
|
|
50
|
+
*/
|
|
51
|
+
enableDebug(): void;
|
|
52
|
+
/**
|
|
53
|
+
* 禁用调试模式
|
|
54
|
+
*/
|
|
55
|
+
disableDebug(): void;
|
|
56
|
+
/**
|
|
57
|
+
* 获取时间戳(包含年月日)
|
|
58
|
+
*/
|
|
59
|
+
private getTimestamp;
|
|
60
|
+
/**
|
|
61
|
+
* 检查是否应该记录日志
|
|
62
|
+
*/
|
|
63
|
+
private shouldLog;
|
|
64
|
+
/**
|
|
65
|
+
* 获取日志级别的颜色符号
|
|
66
|
+
*/
|
|
67
|
+
private getLevelColor;
|
|
68
|
+
/**
|
|
69
|
+
* 格式化日志消息
|
|
70
|
+
*/
|
|
71
|
+
private formatMessage;
|
|
72
|
+
/**
|
|
73
|
+
* 调试日志
|
|
74
|
+
*/
|
|
75
|
+
debug(tag: string, message: string, ...args: any[]): void;
|
|
76
|
+
/**
|
|
77
|
+
* 信息日志
|
|
78
|
+
*/
|
|
79
|
+
info(tag: string, message: string, ...args: any[]): void;
|
|
80
|
+
/**
|
|
81
|
+
* 警告日志
|
|
82
|
+
*/
|
|
83
|
+
warn(tag: string, message: string, ...args: any[]): void;
|
|
84
|
+
/**
|
|
85
|
+
* 错误日志
|
|
86
|
+
*/
|
|
87
|
+
error(tag: string, message: string, ...args: any[]): void;
|
|
88
|
+
/**
|
|
89
|
+
* 分组日志
|
|
90
|
+
*/
|
|
91
|
+
group(tag: string, label?: string): void;
|
|
92
|
+
/**
|
|
93
|
+
* 结束分组日志
|
|
94
|
+
*/
|
|
95
|
+
groupEnd(): void;
|
|
96
|
+
/**
|
|
97
|
+
* 表格日志
|
|
98
|
+
*/
|
|
99
|
+
table(tag: string, data: any): void;
|
|
100
|
+
/**
|
|
101
|
+
* 追踪日志
|
|
102
|
+
*/
|
|
103
|
+
trace(tag: string, message: string): void;
|
|
104
|
+
}
|
|
105
|
+
declare const logger: FXLogger;
|
|
106
|
+
export default logger;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ========== Logger 类型定义 ==========
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.FXLogger = exports.FXLogLevel = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* 日志级别枚举
|
|
7
|
+
*/
|
|
8
|
+
var FXLogLevel;
|
|
9
|
+
(function (FXLogLevel) {
|
|
10
|
+
FXLogLevel[FXLogLevel["DEBUG"] = 0] = "DEBUG";
|
|
11
|
+
FXLogLevel[FXLogLevel["INFO"] = 1] = "INFO";
|
|
12
|
+
FXLogLevel[FXLogLevel["WARN"] = 2] = "WARN";
|
|
13
|
+
FXLogLevel[FXLogLevel["ERROR"] = 3] = "ERROR";
|
|
14
|
+
FXLogLevel[FXLogLevel["SILENT"] = 4] = "SILENT";
|
|
15
|
+
})(FXLogLevel || (exports.FXLogLevel = FXLogLevel = {}));
|
|
16
|
+
/**
|
|
17
|
+
* FX Logger - 专为 React Native 项目设计的调试日志系统
|
|
18
|
+
* 提供丰富的日志功能和灵活的配置选项
|
|
19
|
+
*/
|
|
20
|
+
class FXLogger {
|
|
21
|
+
/**
|
|
22
|
+
* 私有构造函数,实现单例模式
|
|
23
|
+
*/
|
|
24
|
+
constructor() {
|
|
25
|
+
// 自动检测环境
|
|
26
|
+
const isDevelopment = this.isDevelopmentEnvironment();
|
|
27
|
+
// 根据环境设置默认配置
|
|
28
|
+
this.config = {
|
|
29
|
+
debug: isDevelopment, // 开发环境启用调试模式,生产环境禁用
|
|
30
|
+
level: isDevelopment ? FXLogLevel.DEBUG : FXLogLevel.ERROR, // 生产环境只显示错误日志
|
|
31
|
+
showTimestamp: true,
|
|
32
|
+
showTags: true,
|
|
33
|
+
prefix: isDevelopment ? "[FX-DEV]" : "[FX-PROD]", // 不同环境使用不同前缀
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 获取单例实例
|
|
38
|
+
*/
|
|
39
|
+
static getInstance() {
|
|
40
|
+
if (!FXLogger.instance) {
|
|
41
|
+
FXLogger.instance = new FXLogger();
|
|
42
|
+
}
|
|
43
|
+
return FXLogger.instance;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 检测当前是否为开发环境
|
|
47
|
+
*/
|
|
48
|
+
isDevelopmentEnvironment() {
|
|
49
|
+
try {
|
|
50
|
+
// 使用 Function 构造函数来安全地访问全局变量,避免 TypeScript 错误
|
|
51
|
+
const getGlobal = new Function("return this")();
|
|
52
|
+
// 检测 React Native 的 __DEV__ 变量
|
|
53
|
+
if (typeof getGlobal.__DEV__ !== "undefined" && getGlobal.__DEV__) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
// 检测 Node.js 环境变量
|
|
57
|
+
if (typeof getGlobal.process !== "undefined" &&
|
|
58
|
+
getGlobal.process.env &&
|
|
59
|
+
getGlobal.process.env.NODE_ENV === "development") {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
// 检测 window 对象(浏览器环境)
|
|
63
|
+
if (typeof getGlobal.window !== "undefined" && getGlobal.window.__DEV__) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
// 检测全局对象属性
|
|
67
|
+
if (getGlobal.NODE_ENV === "development") {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// 如果检测过程中出错,默认返回 false(生产环境)
|
|
73
|
+
this.error("FXLogger", "Environment detection failed", error);
|
|
74
|
+
}
|
|
75
|
+
// 默认返回 false(生产环境)
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 获取当前配置
|
|
80
|
+
*/
|
|
81
|
+
getConfig() {
|
|
82
|
+
return Object.assign({}, this.config);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 配置 Logger
|
|
86
|
+
*/
|
|
87
|
+
configure(config) {
|
|
88
|
+
this.config = Object.assign(Object.assign({}, this.config), config);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 启用调试模式
|
|
92
|
+
*/
|
|
93
|
+
enableDebug() {
|
|
94
|
+
this.config.debug = true;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 禁用调试模式
|
|
98
|
+
*/
|
|
99
|
+
disableDebug() {
|
|
100
|
+
this.config.debug = false;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取时间戳(包含年月日)
|
|
104
|
+
*/
|
|
105
|
+
getTimestamp() {
|
|
106
|
+
const now = new Date();
|
|
107
|
+
const year = now.getFullYear();
|
|
108
|
+
const month = (now.getMonth() + 1).toString().padStart(2, "0");
|
|
109
|
+
const day = now.getDate().toString().padStart(2, "0");
|
|
110
|
+
const hours = now.getHours().toString().padStart(2, "0");
|
|
111
|
+
const minutes = now.getMinutes().toString().padStart(2, "0");
|
|
112
|
+
const seconds = now.getSeconds().toString().padStart(2, "0");
|
|
113
|
+
const milliseconds = now.getMilliseconds().toString().padStart(3, "0");
|
|
114
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 检查是否应该记录日志
|
|
118
|
+
*/
|
|
119
|
+
shouldLog(level) {
|
|
120
|
+
if (!this.config.debug && level < FXLogLevel.ERROR) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
return level >= this.config.level;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 获取日志级别的颜色符号
|
|
127
|
+
*/
|
|
128
|
+
getLevelColor(level) {
|
|
129
|
+
switch (level) {
|
|
130
|
+
case FXLogLevel.DEBUG:
|
|
131
|
+
return "🔵"; // 蓝色 - 调试
|
|
132
|
+
case FXLogLevel.INFO:
|
|
133
|
+
return "🟢"; // 绿色 - 信息
|
|
134
|
+
case FXLogLevel.WARN:
|
|
135
|
+
return "🟡"; // 黄色 - 警告
|
|
136
|
+
case FXLogLevel.ERROR:
|
|
137
|
+
return "🔴"; // 红色 - 错误
|
|
138
|
+
default:
|
|
139
|
+
return "⚪"; // 默认白色
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 格式化日志消息
|
|
144
|
+
*/
|
|
145
|
+
formatMessage(level, tag, message) {
|
|
146
|
+
const parts = [];
|
|
147
|
+
if (this.config.prefix) {
|
|
148
|
+
parts.push(this.config.prefix);
|
|
149
|
+
}
|
|
150
|
+
if (this.config.showTimestamp) {
|
|
151
|
+
parts.push(`[${this.getTimestamp()}]`);
|
|
152
|
+
}
|
|
153
|
+
// 根据日志级别添加颜色符号
|
|
154
|
+
const levelEnum = FXLogLevel[level.toUpperCase()];
|
|
155
|
+
const colorSymbol = this.getLevelColor(levelEnum);
|
|
156
|
+
parts.push(`[${colorSymbol}${level.toUpperCase()}]`);
|
|
157
|
+
if (this.config.showTags && tag) {
|
|
158
|
+
parts.push(`[${tag}]`);
|
|
159
|
+
}
|
|
160
|
+
return parts.join("") + " " + message;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 调试日志
|
|
164
|
+
*/
|
|
165
|
+
debug(tag, message, ...args) {
|
|
166
|
+
if (!this.shouldLog(FXLogLevel.DEBUG))
|
|
167
|
+
return;
|
|
168
|
+
const formattedMessage = this.formatMessage("debug", tag, message);
|
|
169
|
+
console.log(formattedMessage, ...args);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 信息日志
|
|
173
|
+
*/
|
|
174
|
+
info(tag, message, ...args) {
|
|
175
|
+
if (!this.shouldLog(FXLogLevel.INFO))
|
|
176
|
+
return;
|
|
177
|
+
const formattedMessage = this.formatMessage("info", tag, message);
|
|
178
|
+
console.info(formattedMessage, ...args);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 警告日志
|
|
182
|
+
*/
|
|
183
|
+
warn(tag, message, ...args) {
|
|
184
|
+
if (!this.shouldLog(FXLogLevel.WARN))
|
|
185
|
+
return;
|
|
186
|
+
const formattedMessage = this.formatMessage("warn", tag, message);
|
|
187
|
+
console.warn(formattedMessage, ...args);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* 错误日志
|
|
191
|
+
*/
|
|
192
|
+
error(tag, message, ...args) {
|
|
193
|
+
if (!this.shouldLog(FXLogLevel.ERROR))
|
|
194
|
+
return;
|
|
195
|
+
const formattedMessage = this.formatMessage("error", tag, message);
|
|
196
|
+
console.error(formattedMessage, ...args);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 分组日志
|
|
200
|
+
*/
|
|
201
|
+
group(tag, label) {
|
|
202
|
+
if (!this.shouldLog(FXLogLevel.DEBUG))
|
|
203
|
+
return;
|
|
204
|
+
const groupLabel = label ? `[${tag}] ${label}` : `[${tag}] Group`;
|
|
205
|
+
console.group(groupLabel);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 结束分组日志
|
|
209
|
+
*/
|
|
210
|
+
groupEnd() {
|
|
211
|
+
if (!this.shouldLog(FXLogLevel.DEBUG))
|
|
212
|
+
return;
|
|
213
|
+
console.groupEnd();
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* 表格日志
|
|
217
|
+
*/
|
|
218
|
+
table(tag, data) {
|
|
219
|
+
if (!this.shouldLog(FXLogLevel.DEBUG))
|
|
220
|
+
return;
|
|
221
|
+
console.log(`[${tag}] Table data:`);
|
|
222
|
+
console.table(data);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* 追踪日志
|
|
226
|
+
*/
|
|
227
|
+
trace(tag, message) {
|
|
228
|
+
if (!this.shouldLog(FXLogLevel.DEBUG))
|
|
229
|
+
return;
|
|
230
|
+
console.trace(`[${tag}] ${message}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.FXLogger = FXLogger;
|
|
234
|
+
// 创建全局实例
|
|
235
|
+
const logger = FXLogger.getInstance();
|
|
236
|
+
// 导出默认实例
|
|
237
|
+
exports.default = logger;
|