@pluve/logger-sdk 0.0.1 → 0.0.3

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.
Files changed (44) hide show
  1. package/README.md +195 -76
  2. package/dist/index.js +9 -0
  3. package/dist/loggerSDK.d.ts +36 -0
  4. package/dist/{esm/dbQueue.js → loggerSDK.js} +195 -161
  5. package/dist/transportAdapter.d.ts +51 -0
  6. package/dist/{esm/transportAdapter.js → transportAdapter.js} +260 -111
  7. package/dist/types.d.ts +46 -0
  8. package/dist/utils.d.ts +30 -0
  9. package/dist/utils.js +229 -0
  10. package/lib/dbQueue.js +133 -0
  11. package/{dist/esm → lib}/index.js +1 -1
  12. package/lib/loggerSDK.js +571 -0
  13. package/lib/storeAdapter.js +99 -0
  14. package/lib/transportAdapter.d.ts +66 -0
  15. package/lib/transportAdapter.js +406 -0
  16. package/lib/types.js +1 -0
  17. package/lib/utils.js +50 -0
  18. package/package.json +8 -2
  19. package/dist/cjs/dbQueue.js +0 -88
  20. package/dist/cjs/index.js +0 -29
  21. package/dist/cjs/loggerSDK.js +0 -426
  22. package/dist/cjs/storeAdapter.js +0 -64
  23. package/dist/cjs/transportAdapter.d.ts +0 -5
  24. package/dist/cjs/transportAdapter.js +0 -109
  25. package/dist/cjs/types.js +0 -17
  26. package/dist/cjs/utils.js +0 -69
  27. package/dist/esm/dbQueue.d.ts +0 -10
  28. package/dist/esm/loggerSDK.d.ts +0 -29
  29. package/dist/esm/loggerSDK.js +0 -761
  30. package/dist/esm/storeAdapter.d.ts +0 -7
  31. package/dist/esm/storeAdapter.js +0 -139
  32. package/dist/esm/transportAdapter.d.ts +0 -5
  33. package/dist/esm/types.d.ts +0 -35
  34. package/dist/esm/utils.d.ts +0 -5
  35. package/dist/esm/utils.js +0 -53
  36. package/dist/umd/logger-sdk.min.js +0 -1
  37. /package/dist/{cjs/index.d.ts → index.d.ts} +0 -0
  38. /package/dist/{esm/types.js → types.js} +0 -0
  39. /package/{dist/cjs → lib}/dbQueue.d.ts +0 -0
  40. /package/{dist/esm → lib}/index.d.ts +0 -0
  41. /package/{dist/cjs → lib}/loggerSDK.d.ts +0 -0
  42. /package/{dist/cjs → lib}/storeAdapter.d.ts +0 -0
  43. /package/{dist/cjs → lib}/types.d.ts +0 -0
  44. /package/{dist/cjs → lib}/utils.d.ts +0 -0
package/README.md CHANGED
@@ -1,108 +1,227 @@
1
1
  # @pluve/logger-sdk 使用说明
2
2
 
3
3
  ## 简介
4
- - 统一的前端日志采集 SDK,支持 H5 与微信小程序。
5
- - 能力包括:批量上报、分级路由(`info|warn|error`)、自动 PV/错误/性能采集、本地持久化与 IndexedDB 冗余、页面关闭时 `sendBeacon` 兜底。
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`,示例:`const { LoggerSDK } = window.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
- endpoints: {
18
- default: '/api/collect',
19
- info: '/api/collect/info',
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
- sdk.track({ type: 'custom', level: 'info', ctx: { action: 'click_button' } });
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
- ## 配置项(SDKOptions)
53
- ```ts
74
+ **配置项:**
75
+
76
+ ```typescript
54
77
  interface SDKOptions {
55
- endpoints: Partial<Record<'info'|'warn'|'error'|'default', string>>;
56
- appId?: string;
57
- env?: 'h5' | 'wechat' | 'unknown';
58
- batchSize?: number; // 默认 10
59
- flushInterval?: number; // 默认 5000ms
60
- retryCount?: number; // 默认 3
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
- ```ts
90
- const transport = async (payload: any, opts?: any) => {
91
- const body = JSON.stringify(payload);
92
- if (opts?.useBeacon && navigator.sendBeacon) {
93
- navigator.sendBeacon(opts.endpoint || '', new Blob([body], { type: 'application/json' }));
94
- return;
95
- }
96
- await fetch(opts?.endpoint || '', {
97
- method: 'POST',
98
- headers: { 'Content-Type': 'application/json', ...(opts?.globalHeaders || {}), ...(opts?.headers || {}) },
99
- body,
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
- const sdk = new LoggerSDK({ endpoints: { default: '/api/collect' }, transport });
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
- - 开启 `debug: true` 查看控制台内部日志。
108
- - 生成 UMD Demo HTML:`LoggerSDK.generateDemoHtml()`(方法位置:`packages/logger-sdk/src/loggerSDK.ts:330-361`)。
219
+
220
+ 开启调试模式查看控制台输出:
221
+
222
+ ```typescript
223
+ const sdk = new LoggerSDK({
224
+ endpoint: '/api/log',
225
+ debug: true, // 开启调试
226
+ });
227
+ ```
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /*
2
+ * @Author : 黄震 huangzhen@yfpharmacy.com
3
+ * @Date : 2025-11-21 14:25:26
4
+ * @LastEditors : 黄震 huangzhen@yfpharmacy.com
5
+ * @LastEditTime : 2025-12-04 15:56:03
6
+ * @Description : 描述
7
+ * Copyright (c) 2025 by 益丰大药房连锁股份有限公司, All Rights Reserved.
8
+ */
9
+ export { LoggerSDK } from "./loggerSDK";
@@ -0,0 +1,36 @@
1
+ import { SDKOptions, LogEventType, LogEventLevel } from './types';
2
+ export declare class LoggerSDK {
3
+ private opts;
4
+ private seq;
5
+ private closed;
6
+ /** 预收集的环境信息 tags */
7
+ private envTags;
8
+ constructor(options: SDKOptions);
9
+ private logDebug;
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
+ */
30
+ destroy(): void;
31
+ /**
32
+ * 监听页面卸载事件
33
+ */
34
+ private attachUnloadHandlers;
35
+ }
36
+ export default LoggerSDK;