@be-link/cls-logger 1.0.1-beta.20 → 1.0.1-beta.22

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 CHANGED
@@ -2,79 +2,86 @@
2
2
 
3
3
  腾讯云 CLS(`tencentcloud-cls-sdk-js-web` / `tencentcloud-cls-sdk-js-mini`)日志上报封装,支持 Web、H5 和小程序环境,提供统一的调用方式。
4
4
 
5
+ ## 特性
6
+
7
+ - 自动环境适配(Web / H5 / 小程序)
8
+ - 内存队列批量上报,减少网络请求
9
+ - 页面关闭时 `sendBeacon` 保证日志不丢失
10
+ - 支持浏览器空闲时上报(`requestIdleCallback`)
11
+ - 错误即时上报,信息日志批量上报
12
+ - 自动采集:请求监控、性能监控、错误监控、行为埋点
13
+ - 失败重试 + 本地缓存兜底
14
+
5
15
  ## 安装
6
16
 
7
17
  ```bash
8
18
  pnpm add @be-link/cls-logger
9
19
  ```
10
20
 
11
- > **注意**:
12
- >
13
- > 1. SDK 内部会自动根据运行环境加载对应的腾讯云 SDK(Web 或小程序),无需手动安装额外依赖。
14
- > 2. 如果业务对包体积有极致要求,建议使用**分环境引入方式**(见下文)。
21
+ ### 依赖说明
15
22
 
16
- ## 使用
23
+ | 入口 | 依赖 | 说明 |
24
+ | -------------------------- | -------------------------------------------- | ----------------------------------- |
25
+ | `@be-link/cls-logger` | `tencentcloud-cls-sdk-js-web` | 统一入口,自动适配环境 |
26
+ | `@be-link/cls-logger/web` | `tencentcloud-cls-sdk-js-web` + `web-vitals` | Web/H5 专用,含 Web Vitals 性能监控 |
27
+ | `@be-link/cls-logger/mini` | `tencentcloud-cls-sdk-js-mini` | 小程序专用 |
17
28
 
18
- ### 1. 统一引入方式(推荐快速接入)
29
+ > **注意**:所有依赖已内置,无需手动安装。
19
30
 
20
- 无需关心运行环境(Web 或 小程序),SDK 内部会自动识别并适配。此方式包含全量逻辑,支持动态加载 SDK。
31
+ ## 快速开始
32
+
33
+ ### 1. 统一引入方式(推荐快速接入)
21
34
 
22
35
  ```ts
23
36
  import clsLogger from '@be-link/cls-logger';
24
37
 
25
- // 初始化(建议在应用入口处调用)
26
38
  clsLogger.init({
27
39
  projectId: 'my-project',
28
40
  appId: 'my-app-id',
29
- // 默认配置可不传
30
- // tencentCloud: {
31
- // endpoint: 'https://ap-shanghai.cls.tencentcs.com',
32
- // topicID: '17475bcd-6315-4b20-859c-e7b087fb3683',
33
- // },
34
41
  source: 'my-source',
35
42
  });
36
43
  ```
37
44
 
38
- ### 2. 分环境引入方式(推荐生产环境使用)
45
+ ### 2. 分环境引入方式(推荐生产环境)
39
46
 
40
- 为了获得更小的包体积(Tree Shaking)和更清晰的逻辑,建议根据项目类型引入不同的入口。此方式将物理隔离 Web 和小程序的特有逻辑(如 Web 的 `fetch` 拦截 vs 小程序的 `wx.request` 拦截)。
41
-
42
- #### Web / H5 项目:
47
+ #### Web / H5:
43
48
 
44
49
  ```ts
45
- // 仅包含 Web 相关逻辑,不再包含小程序代码
46
50
  import { clsLogger } from '@be-link/cls-logger/web';
47
51
 
48
52
  clsLogger.init({
49
53
  projectId: 'my-web-project',
50
- // tencentCloud: { ... }, // 可选
51
54
  source: 'web-source',
52
55
  });
53
56
  ```
54
57
 
55
- #### 小程序项目:
58
+ #### 小程序:
56
59
 
57
60
  ```ts
58
- // 仅包含小程序相关逻辑,不再包含 Web 代码
59
61
  import { clsLogger } from '@be-link/cls-logger/mini';
60
62
 
61
63
  clsLogger.init({
62
64
  projectId: 'my-mini-project',
63
- appId: 'wx123456789', // 小程序建议传入 appId
64
- // tencentCloud: { ... }, // 可选
65
+ appId: 'wx123456789',
65
66
  source: 'mini-source',
66
67
  });
67
68
  ```
68
69
 
69
- ## 常用 API
70
+ ## API
70
71
 
71
- ### 开发日志
72
+ ### 日志方法
72
73
 
73
74
  ```ts
74
- // info / warn / error
75
+ // 信息日志(走批量队列)
75
76
  clsLogger.info('应用启动', { startUpTime: 120 });
76
77
 
77
- // Error 日志(支持直接传入 Error 对象,自动解析堆栈)
78
+ // 警告日志(走批量队列)
79
+ clsLogger.warn('资源加载慢', { duration: 3000 });
80
+
81
+ // 错误日志(默认即时上报)
82
+ clsLogger.error('支付失败', { orderId: '123' });
83
+
84
+ // Error 对象(自动解析堆栈)
78
85
  try {
79
86
  doSomething();
80
87
  } catch (err) {
@@ -82,7 +89,17 @@ try {
82
89
  }
83
90
  ```
84
91
 
85
- ### 自定义埋点 (Track)
92
+ ### 即时上报选项
93
+
94
+ ```ts
95
+ // info/warn 强制即时上报
96
+ clsLogger.info('重要事件', { data: 1 }, { immediate: true });
97
+
98
+ // error 走批量队列(默认是即时上报)
99
+ clsLogger.error('非关键错误', { data: 1 }, { immediate: false });
100
+ ```
101
+
102
+ ### 自定义埋点
86
103
 
87
104
  ```ts
88
105
  clsLogger.track('click_event', {
@@ -91,9 +108,7 @@ clsLogger.track('click_event', {
91
108
  });
92
109
  ```
93
110
 
94
- ### 统计埋点 (Stat)
95
-
96
- 用于简单的计数/分布统计。
111
+ ### 统计埋点
97
112
 
98
113
  ```ts
99
114
  clsLogger.stat({
@@ -104,67 +119,245 @@ clsLogger.stat({
104
119
  });
105
120
  ```
106
121
 
107
- ## 功能特性
122
+ ## 配置项
108
123
 
109
- ### 1. 自动环境适配
124
+ ### 完整配置示例
110
125
 
111
- - **Web / H5**: 自动采集浏览器环境信息(UserAgent、屏幕尺寸、网络状态等)。
112
- - **小程序**: 自动采集小程序环境信息(系统信息、微信版本、网络类型等)。
126
+ ```ts
127
+ clsLogger.init({
128
+ // 基础配置
129
+ enabled: true, // 是否启用,默认 true
130
+ projectId: 'my-project', // 项目标识
131
+ appId: 'wx123456789', // 应用 ID(小程序必填)
132
+ appVersion: '1.0.0', // 应用版本
133
+ source: 'my-source', // CLS source
134
+
135
+ // 腾讯云 CLS 配置
136
+ tencentCloud: {
137
+ endpoint: 'https://ap-shanghai.cls.tencentcs.com',
138
+ topicID: 'your-topic-id',
139
+ retry_times: 3,
140
+ },
113
141
 
114
- ### 2. 请求监控 (Request Monitor)
142
+ // 批量上报配置
143
+ batch: {
144
+ maxSize: 50, // 队列达到此数量立即发送,默认 20
145
+ intervalMs: 1000, // 定时批量发送间隔,默认 500ms
146
+ startupDelayMs: 3000, // 启动合并窗口,默认 0(不启用)
147
+ useIdleCallback: true, // 使用浏览器空闲时间上报,默认 false
148
+ idleTimeout: 3000, // 空闲回调超时时间,默认 3000ms
149
+ },
115
150
 
116
- 默认开启。
151
+ // 请求监控配置
152
+ requestMonitor: {
153
+ enabled: true, // 是否开启,默认 true
154
+ sampleRate: 1, // 采样率 0~1,默认 1
155
+ ignoreUrls: [/localhost/], // 忽略的 URL
156
+ includeMethod: true, // 是否携带 method,默认 true
157
+ includeQuery: true, // 是否携带 query,默认 true
158
+ includeBody: true, // 是否携带 body,默认 true
159
+ maxParamLength: 2000, // 参数最大长度,默认 2000
160
+ },
161
+
162
+ // 错误监控配置
163
+ errorMonitor: {
164
+ enabled: true, // 是否开启,默认 true
165
+ sampleRate: 1, // 采样率 0~1,默认 1
166
+ captureResourceError: true, // 是否采集资源加载错误,默认 true
167
+ maxTextLength: 4000, // stack/message 最大长度,默认 4000
168
+ dedupeWindowMs: 3000, // 错误去重窗口,默认 3000ms
169
+ dedupeMaxKeys: 200, // 去重缓存最大 key 数,默认 200
170
+ ignoreMessages: [
171
+ // 忽略的错误信息(默认值)
172
+ 'Script error.',
173
+ 'Script error',
174
+ /^ResizeObserver loop/,
175
+ 'Permission was denied',
176
+ ],
177
+ },
178
+
179
+ // 性能监控配置
180
+ performanceMonitor: {
181
+ enabled: true, // 是否开启,默认 true
182
+ sampleRate: 1, // 采样率 0~1,默认 1
183
+ webVitals: true, // 是否采集 Web Vitals(含 TTFB),默认 true
184
+ resourceTiming: true, // 是否采集资源加载耗时,默认 true
185
+ ignoreUrls: [/localhost/], // 忽略的资源 URL
186
+ maxTextLength: 2000, // 性能指标文本最大长度,默认 2000
187
+ },
188
+
189
+ // 行为埋点配置
190
+ behaviorMonitor: {
191
+ enabled: true, // 是否开启,默认 true
192
+ pv: true, // PV 是否开启,默认 true
193
+ uv: true, // UV 是否开启,默认 true
194
+ click: true, // 点击是否开启,默认 true
195
+ sampleRate: 1, // 采样率 0~1,默认 1
196
+ uvExpireDays: 30, // UV 标识过期天数,默认 30
197
+ clickTrackIdAttr: 'data-track-id', // 点击元素埋点标识属性名
198
+ clickMaxTextLength: 120, // 点击文本最大长度,默认 120
199
+ },
200
+
201
+ // 设备信息配置
202
+ deviceInfo: {
203
+ enabled: true, // 是否开启,默认 true
204
+ includeUserAgent: true, // 是否包含 UA,默认 true
205
+ includeNetwork: true, // 是否包含网络信息,默认 true
206
+ },
117
207
 
118
- - **Web**: 拦截 `fetch` / `XMLHttpRequest`。
119
- - **小程序**: 拦截 `wx.request` / `wx.cloud.callFunction`。
208
+ // 自定义基础字段
209
+ generateBaseFields: () => ({
210
+ userId: getUserId(),
211
+ userName: getUserName(),
212
+ environment: 'production',
213
+ }),
214
+ });
215
+ ```
216
+
217
+ ## 常见场景配置
120
218
 
121
- ### 3. 性能监控 (Performance Monitor)
219
+ ### 场景 1:首屏请求过多
122
220
 
123
- 默认开启。
221
+ 页面首次加载时日志请求过多,影响其他请求:
222
+
223
+ ```ts
224
+ clsLogger.init({
225
+ batch: {
226
+ startupDelayMs: 3000, // 启动 3 秒内的日志合并发送
227
+ maxSize: 100, // 提高队列阈值
228
+ intervalMs: 1000, // 延长批量间隔
229
+ useIdleCallback: true, // 使用浏览器空闲时间上报
230
+ },
231
+ });
232
+ ```
124
233
 
125
- - **Web**: 采集 FCP, LCP, CLS, FID 等 Core Web Vitals 及资源加载耗时。
126
- - **小程序**: 支持采集页面首屏渲染耗时 (`firstRender`)、路由切换耗时 (`route`) 及启动耗时 (`appLaunch`)。
234
+ ### 场景 2:减少资源监控日志
127
235
 
128
- ### 4. 行为埋点 (Behavior Monitor)
236
+ 开发环境资源过多,或生产环境不需要全量资源监控:
129
237
 
130
- 默认开启,支持 PV (Page View) 和 UV (User View) 自动上报。
238
+ ```ts
239
+ clsLogger.init({
240
+ performanceMonitor: {
241
+ resourceTiming: false, // 关闭资源监控
242
+ // 或者采样
243
+ // sampleRate: 0.1, // 10% 采样
244
+ // 或者过滤
245
+ // ignoreUrls: [/localhost/, /node_modules/],
246
+ },
247
+ });
248
+ ```
131
249
 
132
- - **UV ID**: 自动生成并持久化。小程序环境下优先尝试使用 `openid`。
133
- - **点击追踪**: 自动监听点击事件。
134
- - **Web**: 识别带 `data-track-id` 的元素。
135
- ```html
136
- <!-- HTML -->
137
- <button data-track-id="submit_btn">提交</button>
138
- ```
139
- - **小程序**: 识别带 `data-track-id` 的组件(需在 `dataset` 中)。
140
- ```html
141
- <!-- WXML -->
142
- <button data-track-id="submit_btn" bindtap="handleClick">提交</button>
143
- ```
250
+ ### 场景 3:过滤无意义的错误
144
251
 
145
- ## 高级用法
252
+ 过滤第三方 SDK 的跨域错误:
146
253
 
147
- ### 内存队列与批量发送
254
+ ```ts
255
+ clsLogger.init({
256
+ errorMonitor: {
257
+ ignoreMessages: [
258
+ // 默认规则
259
+ 'Script error.',
260
+ 'Script error',
261
+ /^ResizeObserver loop/,
262
+ 'Permission was denied',
263
+ // 自定义规则
264
+ /火山SDK/,
265
+ /VolcEngine/,
266
+ /network error/i,
267
+ ],
268
+ },
269
+ });
270
+ ```
148
271
 
149
- SDK 默认开启内存队列,每 500ms 或达到 20 条日志时自动批量上报,以减少网络请求次数。可通过 `batch` 参数配置:
272
+ ### 场景 4:高并发场景(直播间)
150
273
 
151
274
  ```ts
152
275
  clsLogger.init({
153
276
  batch: {
154
- maxSize: 20,
155
- intervalMs: 500,
156
- startupDelayMs: 1000, // 启动阶段合并窗口
277
+ maxSize: 100, // 提高队列阈值
278
+ intervalMs: 2000, // 延长批量间隔
279
+ useIdleCallback: true, // 空闲时上报
280
+ },
281
+ performanceMonitor: {
282
+ resourceTiming: false, // 关闭资源监控
283
+ },
284
+ requestMonitor: {
285
+ sampleRate: 0.1, // 请求监控采样 10%
157
286
  },
158
287
  });
159
288
  ```
160
289
 
161
- ### 失败重试与本地缓存
290
+ ## 功能说明
291
+
292
+ ### 1. 批量上报机制
293
+
294
+ SDK 使用内存队列批量上报日志:
295
+
296
+ | 触发条件 | 说明 |
297
+ | -------- | ------------------------------------------------------ |
298
+ | 队列满 | 达到 `maxSize` 立即发送 |
299
+ | 定时器 | 每 `intervalMs` 毫秒发送一次 |
300
+ | 页面关闭 | `visibilitychange` + `pagehide` 触发 `sendBeacon` 发送 |
301
+ | 启动合并 | `startupDelayMs` 窗口内的日志尽量合并 |
302
+
303
+ ### 2. 即时上报 vs 批量上报
304
+
305
+ | 方法 | 默认行为 | 说明 |
306
+ | --------- | -------- | -------------------------------------------------------- |
307
+ | `error()` | 即时上报 | 错误需要及时发现,可通过 `{ immediate: false }` 改为批量 |
308
+ | `info()` | 批量上报 | 可通过 `{ immediate: true }` 改为即时 |
309
+ | `warn()` | 批量上报 | 可通过 `{ immediate: true }` 改为即时 |
310
+ | `track()` | 批量上报 | - |
311
+
312
+ ### 3. 页面关闭保障
162
313
 
163
- 上报失败的日志会自动进入重试流程(指数退避算法)。若多次重试仍失败,日志会落盘到本地缓存(`localStorage` 或小程序 `Storage`),在下次应用启动时尝试重新上报。
314
+ 页面关闭时(`visibilitychange` / `pagehide`),SDK 会:
164
315
 
165
- ### 手动注入 SDK
316
+ 1. 使用 `navigator.sendBeacon` 同步发送队列中的日志
317
+ 2. 如果 `sendBeacon` 不可用,将日志缓存到本地存储
318
+ 3. 下次启动时自动重试发送缓存的日志
166
319
 
167
- 在某些特殊构建环境(如某些不允许动态 require 的小程序框架)下,可以手动注入:
320
+ ### 4. 失败重试机制
321
+
322
+ - 上报失败后使用指数退避算法重试
323
+ - 多次重试仍失败,日志落盘到本地缓存
324
+ - 下次应用启动时自动尝试重新上报
325
+ - 本地缓存最多保留 200 条(可配置 `failedCacheMax`)
326
+
327
+ ### 5. 自动采集内容
328
+
329
+ #### 请求监控
330
+
331
+ - **Web**: 拦截 `fetch` / `XMLHttpRequest`
332
+ - **小程序**: 拦截 `wx.request` / `wx.cloud.callFunction`
333
+
334
+ #### 性能监控
335
+
336
+ - **Web**: 使用 [Google web-vitals](https://github.com/GoogleChrome/web-vitals) 库实现
337
+ - **FCP** (First Contentful Paint): 首次内容渲染
338
+ - **LCP** (Largest Contentful Paint): 最大内容渲染(用户交互后自动停止)
339
+ - **CLS** (Cumulative Layout Shift): 累积布局偏移(5秒会话窗口算法)
340
+ - **INP** (Interaction to Next Paint): 交互到绘制延迟(替代 FID)
341
+ - **TTFB** (Time to First Byte): 首字节时间
342
+ - **资源加载耗时**: PerformanceResourceTiming
343
+ - 自动处理 BFCache 恢复时的指标重置
344
+ - 上报数据包含 `rating` 字段:`'good'` | `'needs-improvement'` | `'poor'`
345
+ - **小程序**: 首屏渲染、路由切换、启动耗时
346
+
347
+ #### 错误监控
348
+
349
+ - **Web**: `window.onerror`, `unhandledrejection`, 资源加载错误
350
+ - **小程序**: `wx.onError`, `wx.onUnhandledRejection`, `App.onError`
351
+
352
+ #### 行为埋点
353
+
354
+ - **PV**: 页面访问
355
+ - **UV**: 用户访问(自动生成持久化 ID)
356
+ - **点击**: 带 `data-track-id` 属性的元素点击
357
+
358
+ ## 手动注入 SDK
359
+
360
+ 在某些特殊构建环境下,可以手动注入 SDK:
168
361
 
169
362
  ```ts
170
363
  import { clsLogger } from '@be-link/cls-logger/mini';
@@ -172,6 +365,25 @@ import * as MiniSdk from 'tencentcloud-cls-sdk-js-mini';
172
365
 
173
366
  clsLogger.init({
174
367
  tencentCloud: { topicID: 'xxx', endpoint: 'xxx' },
175
- sdk: MiniSdk, // 手动传入 SDK 实例
368
+ sdk: MiniSdk,
176
369
  });
177
370
  ```
371
+
372
+ ## 类型定义
373
+
374
+ ```ts
375
+ import type {
376
+ ClsLoggerInitOptions,
377
+ BatchOptions,
378
+ ReportOptions,
379
+ RequestMonitorOptions,
380
+ ErrorMonitorOptions,
381
+ PerformanceMonitorOptions,
382
+ BehaviorMonitorOptions,
383
+ DeviceInfoOptions,
384
+ } from '@be-link/cls-logger';
385
+ ```
386
+
387
+ ## License
388
+
389
+ MIT