@pluve/logger-sdk 0.0.3 → 0.0.5
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/README.md +226 -3
- package/dist/index.d.ts +9 -0
- package/dist/index.js +6 -2
- package/dist/loggerSDK.d.ts +26 -2
- package/dist/loggerSDK.js +334 -31
- package/dist/queueManager.d.ts +59 -0
- package/dist/queueManager.js +201 -0
- package/dist/retryManager.d.ts +57 -0
- package/dist/retryManager.js +223 -0
- package/dist/transportAdapter.js +34 -10
- package/dist/types.d.ts +25 -1
- package/dist/utils.d.ts +17 -0
- package/dist/utils.js +134 -2
- package/package.json +4 -6
- package/lib/dbQueue.d.ts +0 -10
- package/lib/dbQueue.js +0 -133
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -9
- package/lib/loggerSDK.d.ts +0 -29
- package/lib/loggerSDK.js +0 -571
- package/lib/storeAdapter.d.ts +0 -7
- package/lib/storeAdapter.js +0 -99
- package/lib/transportAdapter.d.ts +0 -66
- package/lib/transportAdapter.js +0 -406
- package/lib/types.d.ts +0 -35
- package/lib/types.js +0 -1
- package/lib/utils.d.ts +0 -5
- package/lib/utils.js +0 -50
package/README.md
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
## 简介
|
|
4
4
|
|
|
5
|
-
- 轻量级前端日志采集 SDK,支持 H5
|
|
5
|
+
- 轻量级前端日志采集 SDK,支持 H5 浏览器环境和微信小程序
|
|
6
6
|
- 使用 Beacon 和像素图(Image)方式上报,确保兼容性与可靠性
|
|
7
7
|
- 标准化日志格式,易于分析和处理
|
|
8
|
+
- 支持批量上报、异常重试、持久化存储等高级功能
|
|
8
9
|
|
|
9
10
|
## 安装与引入
|
|
10
11
|
|
|
@@ -35,6 +36,12 @@ sdk.track('error', 'TypeError: Cannot read property', {
|
|
|
35
36
|
},
|
|
36
37
|
});
|
|
37
38
|
|
|
39
|
+
// 记录带 traceId 的错误(用于关联多个日志)
|
|
40
|
+
sdk.track('error', 'Request failed', 'trace-abc-123', {
|
|
41
|
+
level: 'error',
|
|
42
|
+
tags: { api: '/api/user' },
|
|
43
|
+
});
|
|
44
|
+
|
|
38
45
|
// 记录自定义事件
|
|
39
46
|
sdk.track('custom', 'User clicked button', {
|
|
40
47
|
level: 'info',
|
|
@@ -48,6 +55,8 @@ sdk.track('custom', 'User clicked button', {
|
|
|
48
55
|
|
|
49
56
|
```typescript
|
|
50
57
|
{
|
|
58
|
+
"logId": "550e8400-e29b-41d4-a716-446655440000", // 日志 ID(UUID v4)
|
|
59
|
+
"traceId": "trace-123456", // 可选:追踪 ID(用于关联多个日志)
|
|
51
60
|
"eventType": "error", // 固定:error/crash/pageview/custom
|
|
52
61
|
"ts": 1690000000000, // 毫秒时间戳
|
|
53
62
|
"appId": "web-shop", // 应用标识
|
|
@@ -81,17 +90,34 @@ interface SDKOptions {
|
|
|
81
90
|
debug?: boolean; // 是否开启调试模式
|
|
82
91
|
pixelParam?: string; // 像素上报参数名,默认 'data'
|
|
83
92
|
maxPixelUrlLen?: number; // 像素上报 URL 最大长度,默认 1900
|
|
93
|
+
|
|
94
|
+
// 批量上报配置
|
|
95
|
+
enableBatch?: boolean; // 是否启用批量上报,默认 true
|
|
96
|
+
batchSize?: number; // 批量上报最大数量,默认 10
|
|
97
|
+
batchInterval?: number; // 批量上报时间间隔(毫秒),默认 5000
|
|
98
|
+
maxQueueSize?: number; // 队列最大长度,默认 100
|
|
99
|
+
|
|
100
|
+
// 持久化存储配置
|
|
101
|
+
enableStorage?: boolean; // 是否启用持久化存储,默认 true
|
|
102
|
+
storagePrefix?: string; // 持久化存储的 key 前缀,默认 'logger_sdk'
|
|
103
|
+
|
|
104
|
+
// 重试配置
|
|
105
|
+
enableRetry?: boolean; // 是否启用重试,默认 true
|
|
106
|
+
maxRetries?: number; // 最大重试次数,默认 3
|
|
107
|
+
retryDelay?: number; // 重试基础延迟时间(毫秒),默认 1000
|
|
108
|
+
retryBackoff?: boolean; // 是否使用指数退避策略,默认 true
|
|
84
109
|
}
|
|
85
110
|
```
|
|
86
111
|
|
|
87
|
-
### `track(eventType, message, options?)`
|
|
112
|
+
### `track(eventType, message, traceId?, options?)`
|
|
88
113
|
|
|
89
|
-
|
|
114
|
+
记录事件日志。每条日志会自动生成唯一的 `logId`(UUID v4 格式)。
|
|
90
115
|
|
|
91
116
|
**参数:**
|
|
92
117
|
|
|
93
118
|
- `eventType`: 事件类型(`'error' | 'crash' | 'pageview' | 'custom'`)
|
|
94
119
|
- `message`: 摘要信息
|
|
120
|
+
- `traceId`: (可选) 追踪 ID,用于关联多个相关日志
|
|
95
121
|
- `options`: 可选配置
|
|
96
122
|
- `level?`: 日志级别(`'info' | 'warn' | 'error' | 'fatal'`),默认 `'info'`
|
|
97
123
|
- `stack?`: 堆栈信息
|
|
@@ -109,6 +135,12 @@ sdk.track('error', 'Failed to load resource', {
|
|
|
109
135
|
tags: { resource: 'image.png' },
|
|
110
136
|
});
|
|
111
137
|
|
|
138
|
+
// 记录带 traceId 的错误(用于关联多个日志)
|
|
139
|
+
sdk.track('error', 'API request failed', 'trace-xyz-789', {
|
|
140
|
+
level: 'error',
|
|
141
|
+
tags: { endpoint: '/api/users', statusCode: 500 },
|
|
142
|
+
});
|
|
143
|
+
|
|
112
144
|
// 记录页面浏览
|
|
113
145
|
sdk.track('pageview', 'User viewed product page', {
|
|
114
146
|
level: 'info',
|
|
@@ -116,6 +148,29 @@ sdk.track('pageview', 'User viewed product page', {
|
|
|
116
148
|
});
|
|
117
149
|
```
|
|
118
150
|
|
|
151
|
+
### 日志 ID 和追踪 ID
|
|
152
|
+
|
|
153
|
+
- **logId**: 每条日志自动生成的唯一标识符(UUID v4 格式),用于全局唯一定位日志
|
|
154
|
+
- **traceId**: 可选的追踪 ID,用于关联同一请求链路上的多个日志(例如:前端请求、后端处理、数据库查询等)
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// 在请求开始时生成 traceId
|
|
158
|
+
const traceId = `trace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
159
|
+
|
|
160
|
+
// 在请求的不同阶段使用相同的 traceId
|
|
161
|
+
sdk.track('custom', 'Request started', traceId, {
|
|
162
|
+
level: 'info',
|
|
163
|
+
tags: { endpoint: '/api/checkout' },
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// ... 请求处理 ...
|
|
167
|
+
|
|
168
|
+
sdk.track('error', 'Request failed', traceId, {
|
|
169
|
+
level: 'error',
|
|
170
|
+
tags: { endpoint: '/api/checkout', error: 'Network timeout' },
|
|
171
|
+
});
|
|
172
|
+
```
|
|
173
|
+
|
|
119
174
|
### `identify(userId: string)`
|
|
120
175
|
|
|
121
176
|
设置用户 ID(用于后续日志关联)。
|
|
@@ -225,3 +280,171 @@ const sdk = new LoggerSDK({
|
|
|
225
280
|
debug: true, // 开启调试
|
|
226
281
|
});
|
|
227
282
|
```
|
|
283
|
+
|
|
284
|
+
## 高级功能
|
|
285
|
+
|
|
286
|
+
### 批量上报
|
|
287
|
+
|
|
288
|
+
SDK 支持批量上报功能,可以显著减少网络请求次数,提高性能:
|
|
289
|
+
|
|
290
|
+
- **队列缓存**:日志先缓存到内存队列,达到条件后批量发送
|
|
291
|
+
- **智能触发**:支持按数量阈值和时间间隔触发上报
|
|
292
|
+
- **手动控制**:提供 `flush()` 方法可手动立即上报
|
|
293
|
+
|
|
294
|
+
### 异常重试
|
|
295
|
+
|
|
296
|
+
为确保日志可靠上报,SDK 提供了自动重试机制:
|
|
297
|
+
|
|
298
|
+
- **自动重试**:上报失败时自动重试(默认最多3次)
|
|
299
|
+
- **指数退避**:采用指数退避策略(1秒→2秒→4秒...)
|
|
300
|
+
- **随机抖动**:添加0-30%随机延迟避免惊群效应
|
|
301
|
+
|
|
302
|
+
### 持久化存储
|
|
303
|
+
|
|
304
|
+
为了防止因页面意外关闭导致日志丢失,SDK 支持持久化存储:
|
|
305
|
+
|
|
306
|
+
- **自动保存**:队列数据自动保存到 localStorage(浏览器)或 Storage(微信小程序)
|
|
307
|
+
- **自动恢复**:页面刷新后自动恢复未上报的日志
|
|
308
|
+
|
|
309
|
+
## 核心流程
|
|
310
|
+
|
|
311
|
+
```mermaid
|
|
312
|
+
graph TB
|
|
313
|
+
A[用户调用 track() 方法] --> B{SDK是否已销毁?}
|
|
314
|
+
B -- 是 --> C[直接返回,不处理]
|
|
315
|
+
B -- 否 --> D[生成标准化日志对象]
|
|
316
|
+
D --> E{是否启用批量上报?}
|
|
317
|
+
E -- 否 --> F[直接上报日志]
|
|
318
|
+
E -- 是 --> G[将日志加入队列]
|
|
319
|
+
G --> H{队列大小是否达到批处理阈值?}
|
|
320
|
+
H -- 是 --> I[立即触发批量上报]
|
|
321
|
+
H -- 否 --> J[等待下次触发]
|
|
322
|
+
|
|
323
|
+
F --> K{是否启用重试机制?}
|
|
324
|
+
K -- 是 --> L[使用重试管理器发送]
|
|
325
|
+
K -- 否 --> M[直接发送请求]
|
|
326
|
+
|
|
327
|
+
L --> N[重试管理器执行发送任务]
|
|
328
|
+
N --> O{发送是否成功?}
|
|
329
|
+
O -- 是 --> P[上报完成]
|
|
330
|
+
O -- 否 --> Q[是否达到最大重试次数?]
|
|
331
|
+
Q -- 否 --> R[计算延迟时间<br/>(指数退避+随机抖动)]
|
|
332
|
+
R --> S[等待后重试]
|
|
333
|
+
S --> N
|
|
334
|
+
Q -- 是 --> T[上报失败,记录错误]
|
|
335
|
+
|
|
336
|
+
M --> U{发送是否成功?}
|
|
337
|
+
U -- 是 --> P
|
|
338
|
+
U -- 否 --> T
|
|
339
|
+
|
|
340
|
+
I --> V[执行批量上报]
|
|
341
|
+
V --> W[从队列获取待发送日志]
|
|
342
|
+
W --> X[调用重试管理器发送批量日志]
|
|
343
|
+
X --> Y{批量发送是否成功?}
|
|
344
|
+
Y -- 是 --> Z[从队列中移除已发送日志]
|
|
345
|
+
Y -- 否 --> AA[保留队列中的日志,下次重试]
|
|
346
|
+
|
|
347
|
+
J --> AB{定时器是否触发?}
|
|
348
|
+
AB -- 是 --> AC[执行批量上报]
|
|
349
|
+
AB -- 否 --> AD{页面是否卸载?}
|
|
350
|
+
AD -- 是 --> AE[调用 flush() 方法上报所有日志]
|
|
351
|
+
|
|
352
|
+
subgraph 队列管理
|
|
353
|
+
AF[内存队列]
|
|
354
|
+
AG[持久化存储<br/>localStorage/Storage]
|
|
355
|
+
AF <--> AG
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
subgraph 传输适配器
|
|
359
|
+
AH[Beacon 适配器]
|
|
360
|
+
AI[Image 像素适配器]
|
|
361
|
+
AJ[微信小程序适配器]
|
|
362
|
+
AK[自动选择最佳适配器]
|
|
363
|
+
AH --> AK
|
|
364
|
+
AI --> AK
|
|
365
|
+
AJ --> AK
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
Z --> P
|
|
369
|
+
AA --> P
|
|
370
|
+
AC --> V
|
|
371
|
+
AE --> V
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## 使用示例
|
|
375
|
+
|
|
376
|
+
### 基础使用(默认启用所有高级功能)
|
|
377
|
+
|
|
378
|
+
```typescript
|
|
379
|
+
import { LoggerSDK } from '@pluve/logger-sdk';
|
|
380
|
+
|
|
381
|
+
const sdk = new LoggerSDK({
|
|
382
|
+
endpoint: 'https://your-api.com/logs',
|
|
383
|
+
appId: 'my-app',
|
|
384
|
+
env: 'prod',
|
|
385
|
+
debug: false,
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
// 记录错误日志
|
|
389
|
+
sdk.track('error', 'TypeError: Cannot read property', {
|
|
390
|
+
level: 'error',
|
|
391
|
+
stack: 'Error stack trace...',
|
|
392
|
+
userId: '123',
|
|
393
|
+
tags: {
|
|
394
|
+
component: 'checkout',
|
|
395
|
+
browser: 'Chrome 120',
|
|
396
|
+
},
|
|
397
|
+
});
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### 批量上报配置
|
|
401
|
+
|
|
402
|
+
```typescript
|
|
403
|
+
const sdk = new LoggerSDK({
|
|
404
|
+
endpoint: 'https://your-api.com/logs',
|
|
405
|
+
appId: 'my-app',
|
|
406
|
+
|
|
407
|
+
// 批量上报配置
|
|
408
|
+
enableBatch: true, // 启用批量上报
|
|
409
|
+
batchSize: 20, // 队列达到20条时批量上报
|
|
410
|
+
batchInterval: 10000, // 或每隔10秒上报一次
|
|
411
|
+
maxQueueSize: 100, // 队列最大100条日志
|
|
412
|
+
|
|
413
|
+
// 持久化存储配置
|
|
414
|
+
enableStorage: true, // 启用持久化存储
|
|
415
|
+
storagePrefix: 'my_app_logger',
|
|
416
|
+
});
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### 重试机制配置
|
|
420
|
+
|
|
421
|
+
```typescript
|
|
422
|
+
const sdk = new LoggerSDK({
|
|
423
|
+
endpoint: 'https://your-api.com/logs',
|
|
424
|
+
appId: 'my-app',
|
|
425
|
+
|
|
426
|
+
// 重试配置
|
|
427
|
+
enableRetry: true, // 启用重试机制
|
|
428
|
+
maxRetries: 5, // 最多重试5次
|
|
429
|
+
retryDelay: 2000, // 基础延迟2秒
|
|
430
|
+
retryBackoff: true, // 启用指数退避
|
|
431
|
+
});
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### 手动刷新队列
|
|
435
|
+
|
|
436
|
+
```typescript
|
|
437
|
+
// 立即上报所有待发送日志
|
|
438
|
+
await sdk.flush();
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### 禁用批量上报(实时上报)
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
const sdk = new LoggerSDK({
|
|
445
|
+
endpoint: 'https://your-api.com/logs',
|
|
446
|
+
appId: 'my-app',
|
|
447
|
+
enableBatch: false, // 禁用批量上报,每条日志立即发送
|
|
448
|
+
enableRetry: true, // 仍然启用重试
|
|
449
|
+
});
|
|
450
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,10 @@
|
|
|
1
1
|
export { LoggerSDK } from './loggerSDK';
|
|
2
|
+
export { defaultTransport, TransportAdapters } from './transportAdapter';
|
|
3
|
+
export type { TransportAdapter, TransportOptions } from './transportAdapter';
|
|
4
|
+
export type { SDKOptions, LogEvent, LogEventType, LogEventLevel, Env } from './types';
|
|
5
|
+
export type { PlatformType, EnvironmentInfo } from './utils';
|
|
6
|
+
export { getEnvironmentInfo, parseBrowserInfo, isWeChatMiniProgram, gzipCompress, isGzipSupported } from './utils';
|
|
7
|
+
export { QueueManager } from './queueManager';
|
|
8
|
+
export type { QueueOptions } from './queueManager';
|
|
9
|
+
export { RetryManager } from './retryManager';
|
|
10
|
+
export type { RetryOptions } from './retryManager';
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
* @Author : 黄震 huangzhen@yfpharmacy.com
|
|
3
3
|
* @Date : 2025-11-21 14:25:26
|
|
4
4
|
* @LastEditors : 黄震 huangzhen@yfpharmacy.com
|
|
5
|
-
* @LastEditTime : 2025-12-
|
|
5
|
+
* @LastEditTime : 2025-12-18 13:26:30
|
|
6
6
|
* @Description : 描述
|
|
7
7
|
* Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
|
|
8
8
|
*/
|
|
9
|
-
export { LoggerSDK } from "./loggerSDK";
|
|
9
|
+
export { LoggerSDK } from "./loggerSDK";
|
|
10
|
+
export { defaultTransport, TransportAdapters } from "./transportAdapter";
|
|
11
|
+
export { getEnvironmentInfo, parseBrowserInfo, isWeChatMiniProgram, gzipCompress, isGzipSupported } from "./utils";
|
|
12
|
+
export { QueueManager } from "./queueManager";
|
|
13
|
+
export { RetryManager } from "./retryManager";
|
package/dist/loggerSDK.d.ts
CHANGED
|
@@ -5,6 +5,14 @@ export declare class LoggerSDK {
|
|
|
5
5
|
private closed;
|
|
6
6
|
/** 预收集的环境信息 tags */
|
|
7
7
|
private envTags;
|
|
8
|
+
/** 队列管理器 */
|
|
9
|
+
private queueManager?;
|
|
10
|
+
/** 重试管理器 */
|
|
11
|
+
private retryManager?;
|
|
12
|
+
/** 批量上报定时器 */
|
|
13
|
+
private batchTimer?;
|
|
14
|
+
/** 是否正在上报 */
|
|
15
|
+
private isSending;
|
|
8
16
|
constructor(options: SDKOptions);
|
|
9
17
|
private logDebug;
|
|
10
18
|
/**
|
|
@@ -14,7 +22,7 @@ export declare class LoggerSDK {
|
|
|
14
22
|
/**
|
|
15
23
|
* 记录事件
|
|
16
24
|
*/
|
|
17
|
-
track(eventType: LogEventType, message: string, options?: {
|
|
25
|
+
track(eventType: LogEventType, message: string, traceId?: string, options?: {
|
|
18
26
|
level?: LogEventLevel;
|
|
19
27
|
stack?: string;
|
|
20
28
|
userId?: string;
|
|
@@ -24,10 +32,26 @@ export declare class LoggerSDK {
|
|
|
24
32
|
* 设置用户信息
|
|
25
33
|
*/
|
|
26
34
|
identify(userId: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* 手动刷新队列,立即上报所有待发送日志
|
|
37
|
+
*/
|
|
38
|
+
flush(): Promise<void>;
|
|
27
39
|
/**
|
|
28
40
|
* 销毁实例
|
|
29
41
|
*/
|
|
30
|
-
destroy(): void
|
|
42
|
+
destroy(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* 发送单个事件(带重试)
|
|
45
|
+
*/
|
|
46
|
+
private sendEvent;
|
|
47
|
+
/**
|
|
48
|
+
* 批量发送事件(带重试)
|
|
49
|
+
*/
|
|
50
|
+
private sendBatch;
|
|
51
|
+
/**
|
|
52
|
+
* 启动批量上报定时器
|
|
53
|
+
*/
|
|
54
|
+
private startBatchTimer;
|
|
31
55
|
/**
|
|
32
56
|
* 监听页面卸载事件
|
|
33
57
|
*/
|