@pluve/logger-sdk 0.0.1 → 0.0.2
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 +195 -76
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.js +14 -2
- package/dist/cjs/loggerSDK.d.ts +27 -20
- package/dist/cjs/loggerSDK.js +86 -354
- package/dist/cjs/transportAdapter.d.ts +51 -5
- package/dist/cjs/transportAdapter.js +133 -60
- package/dist/cjs/types.d.ts +37 -26
- package/dist/cjs/utils.d.ts +27 -2
- package/dist/cjs/utils.js +151 -12
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +4 -2
- package/dist/esm/loggerSDK.d.ts +27 -20
- package/dist/esm/loggerSDK.js +141 -674
- package/dist/esm/transportAdapter.d.ts +51 -5
- package/dist/esm/transportAdapter.js +260 -111
- package/dist/esm/types.d.ts +37 -26
- package/dist/esm/utils.d.ts +27 -2
- package/dist/esm/utils.js +190 -14
- package/dist/umd/logger-sdk.min.js +1 -1
- package/lib/dbQueue.js +133 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +9 -0
- package/lib/loggerSDK.d.ts +29 -0
- package/lib/loggerSDK.js +571 -0
- package/lib/storeAdapter.js +99 -0
- package/lib/transportAdapter.d.ts +66 -0
- package/lib/transportAdapter.js +406 -0
- package/lib/types.d.ts +35 -0
- package/lib/types.js +1 -0
- package/lib/utils.d.ts +5 -0
- package/lib/utils.js +50 -0
- package/package.json +8 -2
- package/dist/cjs/dbQueue.js +0 -88
- package/dist/cjs/storeAdapter.js +0 -64
- package/dist/esm/dbQueue.d.ts +0 -10
- package/dist/esm/dbQueue.js +0 -194
- package/dist/esm/storeAdapter.d.ts +0 -7
- package/dist/esm/storeAdapter.js +0 -139
- /package/{dist/cjs → lib}/dbQueue.d.ts +0 -0
- /package/{dist/cjs → lib}/storeAdapter.d.ts +0 -0
package/README.md
CHANGED
|
@@ -1,108 +1,227 @@
|
|
|
1
1
|
# @pluve/logger-sdk 使用说明
|
|
2
2
|
|
|
3
3
|
## 简介
|
|
4
|
-
|
|
5
|
-
-
|
|
4
|
+
|
|
5
|
+
- 轻量级前端日志采集 SDK,支持 H5 浏览器环境
|
|
6
|
+
- 使用 Beacon 和像素图(Image)方式上报,确保兼容性与可靠性
|
|
7
|
+
- 标准化日志格式,易于分析和处理
|
|
6
8
|
|
|
7
9
|
## 安装与引入
|
|
10
|
+
|
|
8
11
|
- 安装:`pnpm add @pluve/logger-sdk`
|
|
9
|
-
- ESM:`import LoggerSDK from '@pluve/logger-sdk'`
|
|
10
|
-
- UMD:构建后全局为 `LoggerSDK
|
|
12
|
+
- ESM:`import { LoggerSDK } from '@pluve/logger-sdk'`
|
|
13
|
+
- UMD:构建后全局为 `LoggerSDK`
|
|
11
14
|
|
|
12
15
|
## 快速开始
|
|
16
|
+
|
|
13
17
|
```ts
|
|
14
|
-
import LoggerSDK from '@pluve/logger-sdk';
|
|
18
|
+
import { LoggerSDK } from '@pluve/logger-sdk';
|
|
15
19
|
|
|
16
20
|
const sdk = new LoggerSDK({
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
warn: '/api/collect/warn',
|
|
21
|
-
error: '/api/collect/error',
|
|
22
|
-
},
|
|
23
|
-
appId: 'your-app',
|
|
21
|
+
endpoint: '/api/log',
|
|
22
|
+
appId: 'web-shop',
|
|
23
|
+
env: 'prod', // prod/stage/dev
|
|
24
24
|
debug: true,
|
|
25
|
-
enableAutoPV: true,
|
|
26
|
-
enablePerf: true,
|
|
27
25
|
});
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
// 记录错误日志
|
|
28
|
+
sdk.track('error', 'TypeError: Cannot read property', {
|
|
29
|
+
level: 'error',
|
|
30
|
+
stack: 'Error stack trace...',
|
|
31
|
+
userId: '123',
|
|
32
|
+
tags: {
|
|
33
|
+
component: 'checkout',
|
|
34
|
+
browser: 'Chrome 120',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// 记录自定义事件
|
|
39
|
+
sdk.track('custom', 'User clicked button', {
|
|
40
|
+
level: 'info',
|
|
41
|
+
tags: { action: 'click', button: 'submit' },
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 标准化日志格式
|
|
46
|
+
|
|
47
|
+
上报的日志数据遵循以下标准格式:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
{
|
|
51
|
+
"eventType": "error", // 固定:error/crash/pageview/custom
|
|
52
|
+
"ts": 1690000000000, // 毫秒时间戳
|
|
53
|
+
"appId": "web-shop", // 应用标识
|
|
54
|
+
"env": "prod", // prod/stage/dev
|
|
55
|
+
"level": "error", // info/warn/error/fatal
|
|
56
|
+
"message": "TypeError: ...", // 摘要
|
|
57
|
+
"stack": "...", // 可选:长字符串
|
|
58
|
+
"url": "https://...", // 发生页面
|
|
59
|
+
"userId": "123", // 可选:用户ID(脱敏)
|
|
60
|
+
"sessionId": "...", // 会话标识
|
|
61
|
+
"tags": { // 可选的结构化额外信息
|
|
62
|
+
"component": "checkout",
|
|
63
|
+
"browser": "Chrome 120"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
30
66
|
```
|
|
31
67
|
|
|
32
68
|
## API
|
|
33
|
-
- `new LoggerSDK(options)`
|
|
34
|
-
- `track(event, headers?)`:事件入队并持久化,必要时触发批量上报。位置 `packages/logger-sdk/src/loggerSDK.ts:121`
|
|
35
|
-
- `flush(extraHeaders?)`:按批量大小取队列,同批按 `level` 并行上报并重试。位置 `packages/logger-sdk/src/loggerSDK.ts:156-221`
|
|
36
|
-
- `flushAll()`:非阻塞轮询清空队列,尊重并发锁。位置 `packages/logger-sdk/src/loggerSDK.ts:223-233`
|
|
37
|
-
- `identify(user)`:设置应用/用户信息(如 `appId`)。位置 `packages/logger-sdk/src/loggerSDK.ts:222`
|
|
38
|
-
- `setCommon(params)`:动态覆写通用配置(如 `globalHeaders`)。位置 `packages/logger-sdk/src/loggerSDK.ts:227`
|
|
39
|
-
- `destroy()`:停止定时器并关闭。位置 `packages/logger-sdk/src/loggerSDK.ts:232`
|
|
40
69
|
|
|
41
|
-
|
|
42
|
-
- 错误采集:JS 错误、未捕获 Promise、资源加载错误。位置 `packages/logger-sdk/src/loggerSDK.ts:238-275`
|
|
43
|
-
- 自动 PV:拦截 `history.pushState/replaceState` 与 `popstate`,采集单页浏览。位置 `packages/logger-sdk/src/loggerSDK.ts:277-299`
|
|
44
|
-
- 性能采集:Navigation Timing + Paint Entries。位置 `packages/logger-sdk/src/loggerSDK.ts:301-328`
|
|
70
|
+
### `new LoggerSDK(options: SDKOptions)`
|
|
45
71
|
|
|
46
|
-
|
|
47
|
-
- 当页面隐藏或关闭时触发 `flushBeacon()`,使用 `navigator.sendBeacon` 尝试上报队列,不阻塞、不移除队列。
|
|
48
|
-
- 监听位置:`packages/logger-sdk/src/loggerSDK.ts:270-293`
|
|
49
|
-
- 方法位置:`packages/logger-sdk/src/loggerSDK.ts:333-350`
|
|
50
|
-
- 传输适配器 Beacon 通道:`packages/logger-sdk/src/transportAdapter.ts:12-20`
|
|
72
|
+
创建 SDK 实例。
|
|
51
73
|
|
|
52
|
-
|
|
53
|
-
|
|
74
|
+
**配置项:**
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
54
77
|
interface SDKOptions {
|
|
55
|
-
|
|
56
|
-
appId?: string;
|
|
57
|
-
env?:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
retryBase?: number; // 默认 300ms(指数退避基数)
|
|
62
|
-
storageKey?: string; // 默认 'logger_sdk_cache_v2'
|
|
63
|
-
maxCacheSize?: number; // 默认 2000
|
|
64
|
-
timeout?: number; // 默认 10000ms
|
|
65
|
-
debug?: boolean;
|
|
66
|
-
transport?: (payload: any, opts?: SDKOptions & { endpoint?: string, headers?: Record<string,string> }) => Promise<void>;
|
|
67
|
-
globalHeaders?: Record<string,string>;
|
|
68
|
-
enableAutoPV?: boolean; // 默认 true
|
|
69
|
-
enablePerf?: boolean; // 默认 true
|
|
70
|
-
useBeacon?: boolean; // 传输适配器识别 Beacon 的标志(SDK 内部在 flushBeacon 时传入)
|
|
78
|
+
endpoint: string; // 上报端点 URL(必选)
|
|
79
|
+
appId?: string; // 应用 ID,默认 'unknown'
|
|
80
|
+
env?: Env; // 环境标识:prod/stage/dev,默认 'dev'
|
|
81
|
+
debug?: boolean; // 是否开启调试模式
|
|
82
|
+
pixelParam?: string; // 像素上报参数名,默认 'data'
|
|
83
|
+
maxPixelUrlLen?: number; // 像素上报 URL 最大长度,默认 1900
|
|
71
84
|
}
|
|
72
85
|
```
|
|
73
86
|
|
|
74
|
-
|
|
75
|
-
- 默认选择:`sendBeacon`(兜底)→ 微信 `wx.request` → 浏览器 `fetch`。
|
|
76
|
-
- 可自定义:实现 `transport(payload, opts)`,识别 `opts.useBeacon` 后走轻量通道。
|
|
87
|
+
### `track(eventType, message, options?)`
|
|
77
88
|
|
|
78
|
-
|
|
79
|
-
- H5:`localStorage` + IndexedDB 冗余队列。初始化位置 `packages/logger-sdk/src/loggerSDK.ts:50-61`
|
|
80
|
-
- 微信:`wx.*Storage`。实现位置 `packages/logger-sdk/src/storeAdapter.ts`
|
|
89
|
+
记录事件日志。
|
|
81
90
|
|
|
82
|
-
|
|
83
|
-
- 分级路由:至少提供 `default`,按需配置 `info|warn|error` 的独立地址。
|
|
84
|
-
- 吞吐与可靠性:高频场景提高 `batchSize`(如 20–50),缩短 `flushInterval`(如 3000–5000ms);弱网提高 `retryCount` 或 `retryBase`。
|
|
85
|
-
- 统一头部:在 `globalHeaders` 添加溯源头(如 `x-trace-id`、`x-app-version`)。
|
|
86
|
-
- 页面关闭兜底:无需手动调用,SDK 已自动在合适时机触发;若使用自定义 `transport`,注意识别 `useBeacon`。
|
|
91
|
+
**参数:**
|
|
87
92
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
- `eventType`: 事件类型(`'error' | 'crash' | 'pageview' | 'custom'`)
|
|
94
|
+
- `message`: 摘要信息
|
|
95
|
+
- `options`: 可选配置
|
|
96
|
+
- `level?`: 日志级别(`'info' | 'warn' | 'error' | 'fatal'`),默认 `'info'`
|
|
97
|
+
- `stack?`: 堆栈信息
|
|
98
|
+
- `userId?`: 用户 ID
|
|
99
|
+
- `tags?`: 额外的结构化信息
|
|
100
|
+
|
|
101
|
+
**示例:**
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// 记录错误
|
|
105
|
+
sdk.track('error', 'Failed to load resource', {
|
|
106
|
+
level: 'error',
|
|
107
|
+
stack: error.stack,
|
|
108
|
+
userId: '123',
|
|
109
|
+
tags: { resource: 'image.png' },
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// 记录页面浏览
|
|
113
|
+
sdk.track('pageview', 'User viewed product page', {
|
|
114
|
+
level: 'info',
|
|
115
|
+
tags: { productId: 'P123' },
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### `identify(userId: string)`
|
|
120
|
+
|
|
121
|
+
设置用户 ID(用于后续日志关联)。
|
|
122
|
+
|
|
123
|
+
### `destroy()`
|
|
124
|
+
|
|
125
|
+
销毁 SDK 实例,停止所有监听。
|
|
126
|
+
|
|
127
|
+
## 自动采集
|
|
128
|
+
|
|
129
|
+
SDK 会自动监听以下页面事件并上报:
|
|
130
|
+
|
|
131
|
+
- **页面隐藏**(`visibilitychange`):当页面变为隐藏状态时
|
|
132
|
+
- **页面卸载**(`pagehide`, `beforeunload`):当用户离开页面时
|
|
133
|
+
|
|
134
|
+
这些事件使用 Beacon API 上报,确保在页面关闭时仍能成功发送。
|
|
135
|
+
|
|
136
|
+
## 上报方式
|
|
137
|
+
|
|
138
|
+
SDK 使用两种上报方式,按优先级自动选择:
|
|
139
|
+
|
|
140
|
+
### 1. Beacon API(优先)
|
|
141
|
+
|
|
142
|
+
- **兼容性**:Chrome 39+, Firefox 31+, Edge 14+
|
|
143
|
+
- **特点**:页面卸载时可靠传输,不阻塞页面关闭
|
|
144
|
+
- **限制**:无法获取响应,队列大小限制(通常 64KB)
|
|
145
|
+
|
|
146
|
+
### 2. Image 像素上报(降级)
|
|
147
|
+
|
|
148
|
+
- **兼容性**:所有浏览器
|
|
149
|
+
- **特点**:轻量级,无跨域限制
|
|
150
|
+
- **限制**:URL 长度限制(默认 1900 字符)
|
|
151
|
+
|
|
152
|
+
如果 Beacon 失败,会自动降级到 Image 方式。
|
|
153
|
+
|
|
154
|
+
## 使用场景
|
|
155
|
+
|
|
156
|
+
### 错误监控
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
// 全局错误捕获
|
|
160
|
+
window.addEventListener('error', (event) => {
|
|
161
|
+
sdk.track('error', event.message, {
|
|
162
|
+
level: 'error',
|
|
163
|
+
stack: event.error?.stack,
|
|
164
|
+
tags: {
|
|
165
|
+
filename: event.filename,
|
|
166
|
+
lineno: event.lineno,
|
|
167
|
+
colno: event.colno,
|
|
168
|
+
},
|
|
100
169
|
});
|
|
101
|
-
};
|
|
170
|
+
});
|
|
102
171
|
|
|
103
|
-
|
|
172
|
+
// Promise 错误捕获
|
|
173
|
+
window.addEventListener('unhandledrejection', (event) => {
|
|
174
|
+
sdk.track('error', 'Unhandled Promise Rejection', {
|
|
175
|
+
level: 'error',
|
|
176
|
+
stack: event.reason?.stack || String(event.reason),
|
|
177
|
+
});
|
|
178
|
+
});
|
|
104
179
|
```
|
|
105
180
|
|
|
181
|
+
### 页面浏览统计
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
// 记录页面浏览
|
|
185
|
+
sdk.track('pageview', document.title, {
|
|
186
|
+
level: 'info',
|
|
187
|
+
tags: {
|
|
188
|
+
path: window.location.pathname,
|
|
189
|
+
referrer: document.referrer,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### 用户行为追踪
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
// 记录用户点击
|
|
198
|
+
button.addEventListener('click', () => {
|
|
199
|
+
sdk.track('custom', 'Button clicked', {
|
|
200
|
+
level: 'info',
|
|
201
|
+
userId: currentUserId,
|
|
202
|
+
tags: {
|
|
203
|
+
buttonId: button.id,
|
|
204
|
+
page: 'checkout',
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## 最佳实践
|
|
211
|
+
|
|
212
|
+
1. **设置正确的环境标识**:确保在不同环境(prod/stage/dev)使用正确的配置
|
|
213
|
+
2. **使用有意义的 message**:摘要信息应简洁明了,便于快速定位问题
|
|
214
|
+
3. **合理使用 tags**:将额外的结构化信息放在 tags 中,便于分析和过滤
|
|
215
|
+
4. **用户隐私保护**:userId 应该经过脱敏处理
|
|
216
|
+
5. **控制日志量**:避免在高频操作中记录过多日志
|
|
217
|
+
|
|
106
218
|
## 调试
|
|
107
|
-
|
|
108
|
-
|
|
219
|
+
|
|
220
|
+
开启调试模式查看控制台输出:
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
const sdk = new LoggerSDK({
|
|
224
|
+
endpoint: '/api/log',
|
|
225
|
+
debug: true, // 开启调试
|
|
226
|
+
});
|
|
227
|
+
```
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1 +1,6 @@
|
|
|
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 } from './utils';
|
package/dist/cjs/index.js
CHANGED
|
@@ -19,11 +19,23 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
19
19
|
// src/index.ts
|
|
20
20
|
var src_exports = {};
|
|
21
21
|
__export(src_exports, {
|
|
22
|
-
LoggerSDK: () => import_loggerSDK.LoggerSDK
|
|
22
|
+
LoggerSDK: () => import_loggerSDK.LoggerSDK,
|
|
23
|
+
TransportAdapters: () => import_transportAdapter.TransportAdapters,
|
|
24
|
+
defaultTransport: () => import_transportAdapter.defaultTransport,
|
|
25
|
+
getEnvironmentInfo: () => import_utils.getEnvironmentInfo,
|
|
26
|
+
isWeChatMiniProgram: () => import_utils.isWeChatMiniProgram,
|
|
27
|
+
parseBrowserInfo: () => import_utils.parseBrowserInfo
|
|
23
28
|
});
|
|
24
29
|
module.exports = __toCommonJS(src_exports);
|
|
25
30
|
var import_loggerSDK = require("./loggerSDK");
|
|
31
|
+
var import_transportAdapter = require("./transportAdapter");
|
|
32
|
+
var import_utils = require("./utils");
|
|
26
33
|
// Annotate the CommonJS export names for ESM import in node:
|
|
27
34
|
0 && (module.exports = {
|
|
28
|
-
LoggerSDK
|
|
35
|
+
LoggerSDK,
|
|
36
|
+
TransportAdapters,
|
|
37
|
+
defaultTransport,
|
|
38
|
+
getEnvironmentInfo,
|
|
39
|
+
isWeChatMiniProgram,
|
|
40
|
+
parseBrowserInfo
|
|
29
41
|
});
|
package/dist/cjs/loggerSDK.d.ts
CHANGED
|
@@ -1,29 +1,36 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SDKOptions, LogEventType, LogEventLevel } from './types';
|
|
2
2
|
export declare class LoggerSDK {
|
|
3
3
|
private opts;
|
|
4
|
-
private env;
|
|
5
|
-
private inMemoryQueue;
|
|
6
4
|
private seq;
|
|
7
|
-
private timerId;
|
|
8
|
-
private storage;
|
|
9
5
|
private closed;
|
|
10
|
-
|
|
11
|
-
private
|
|
6
|
+
/** 预收集的环境信息 tags */
|
|
7
|
+
private envTags;
|
|
12
8
|
constructor(options: SDKOptions);
|
|
13
9
|
private logDebug;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
10
|
+
/**
|
|
11
|
+
* 收集环境信息并生成 tags(仅在初始化时执行一次)
|
|
12
|
+
*/
|
|
13
|
+
private collectEnvironmentTags;
|
|
14
|
+
/**
|
|
15
|
+
* 记录事件
|
|
16
|
+
*/
|
|
17
|
+
track(eventType: LogEventType, message: string, options?: {
|
|
18
|
+
level?: LogEventLevel;
|
|
19
|
+
stack?: string;
|
|
20
|
+
userId?: string;
|
|
21
|
+
tags?: Record<string, any>;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* 设置用户信息
|
|
25
|
+
*/
|
|
26
|
+
identify(userId: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* 销毁实例
|
|
29
|
+
*/
|
|
23
30
|
destroy(): void;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
private
|
|
31
|
+
/**
|
|
32
|
+
* 监听页面卸载事件
|
|
33
|
+
*/
|
|
34
|
+
private attachUnloadHandlers;
|
|
28
35
|
}
|
|
29
36
|
export default LoggerSDK;
|