@be-link/cls-logger 1.0.1-beta.9 → 1.0.4
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 +115 -31
- package/dist/ClsLogger.d.ts.map +1 -1
- package/dist/ClsLoggerCore.d.ts +4 -3
- package/dist/ClsLoggerCore.d.ts.map +1 -1
- package/dist/behaviorMonitor.d.ts.map +1 -1
- package/dist/errorMonitor.d.ts.map +1 -1
- package/dist/index.esm.js +176 -44
- package/dist/index.js +176 -44
- package/dist/index.umd.js +176 -44
- package/dist/mini.esm.js +111 -19
- package/dist/mini.js +111 -19
- package/dist/performanceMonitor.d.ts.map +1 -1
- package/dist/types.d.ts +19 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/web.esm.js +111 -19
- package/dist/web.js +111 -19
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @be-link/cls-logger
|
|
2
2
|
|
|
3
|
-
腾讯云 CLS(`tencentcloud-cls-sdk-js-web
|
|
3
|
+
腾讯云 CLS(`tencentcloud-cls-sdk-js-web` / `tencentcloud-cls-sdk-js-mini`)日志上报封装,支持 Web、H5 和小程序环境,提供统一的调用方式。
|
|
4
4
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
@@ -8,58 +8,142 @@
|
|
|
8
8
|
pnpm add @be-link/cls-logger
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
> 依赖说明:本包依赖了腾讯云的 Web 和小程序 SDK。在使用时,内部会自动根据运行环境加载对应的 SDK。
|
|
12
|
+
|
|
11
13
|
## 使用
|
|
12
14
|
|
|
15
|
+
**统一引入方式**,无需关心运行环境(Web 或 小程序),SDK 内部会自动识别并适配。
|
|
16
|
+
|
|
13
17
|
```ts
|
|
14
|
-
import clsLogger
|
|
18
|
+
import clsLogger from '@be-link/cls-logger';
|
|
15
19
|
|
|
20
|
+
// 1. 初始化(建议在应用入口处调用)
|
|
16
21
|
clsLogger.init({
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
projectName: 'be-link-pandora',
|
|
23
|
+
appId: 'be-link-pandora',
|
|
24
|
+
appVersion: getCurrentVersion(),
|
|
25
|
+
envType: 'browser',
|
|
26
|
+
generateBaseFields: () => {
|
|
27
|
+
return {
|
|
28
|
+
userId: getUserInfo().id,
|
|
29
|
+
userName: getUserInfo().name,
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
performanceMonitor: {
|
|
34
|
+
ignoreUrls: ['http://localhost:3000'],
|
|
35
|
+
},
|
|
36
|
+
requestMonitor: {
|
|
37
|
+
ignoreUrls: ['http://localhost:3000'],
|
|
38
|
+
},
|
|
39
|
+
tencentCloud: {
|
|
40
|
+
endpoint: 'https://ap-shanghai.cls.tencentcs.com',
|
|
41
|
+
topicID: '17475bcd-6315-4b20-859c-e7b087fb3683',
|
|
42
|
+
retry_times: 3,
|
|
43
|
+
source: 'be-link-pandora',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// 开发日志: info warn error 日志
|
|
48
|
+
clsLogger.info('应用启动', { startUpTime: 120 });
|
|
49
|
+
// Error 日志(支持直接传入 Error 对象,自动解析堆栈)
|
|
50
|
+
try {
|
|
51
|
+
doSomething();
|
|
52
|
+
} catch (err) {
|
|
53
|
+
clsLogger.error(err, { module: 'payment' });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 3. 自定义埋点 (Track)
|
|
57
|
+
clsLogger.track('click_event', {
|
|
58
|
+
button: 'submit',
|
|
59
|
+
page: '/home',
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 功能特性
|
|
64
|
+
|
|
65
|
+
### 1. 自动环境适配
|
|
66
|
+
|
|
67
|
+
- **Web / H5**: 自动加载 `tencentcloud-cls-sdk-js-web`,采集浏览器环境信息(UserAgent、Web Vitals 等)。
|
|
68
|
+
- **小程序**: 自动加载 `tencentcloud-cls-sdk-js-mini`,适配 `wx.request`,采集小程序环境信息(SystemInfo、NetworkType 等)。
|
|
69
|
+
|
|
70
|
+
### 2. 请求监控 (Request Monitor)
|
|
71
|
+
|
|
72
|
+
默认开启 HTTP 请求监控。
|
|
73
|
+
|
|
74
|
+
- Web: 拦截 `fetch` / `XMLHttpRequest`
|
|
75
|
+
- 小程序: 拦截 `wx.request` / `wx.cloud.callFunction`
|
|
76
|
+
|
|
77
|
+
如需关闭或配置:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
clsLogger.init({
|
|
81
|
+
requestMonitor: {
|
|
82
|
+
enabled: true,
|
|
83
|
+
ignoreUrls: ['example.com', /login/], // 忽略特定 URL
|
|
84
|
+
},
|
|
20
85
|
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 3. 性能监控 (Performance Monitor)
|
|
89
|
+
|
|
90
|
+
默认开启性能指标采集。
|
|
91
|
+
|
|
92
|
+
- Web: 采集 FCP, LCP, CLS, FID 等 Core Web Vitals 及资源加载耗时。
|
|
93
|
+
- 小程序: 暂不支持性能指标自动采集。
|
|
94
|
+
|
|
95
|
+
### 4. 行为埋点 (Behavior Monitor)
|
|
96
|
+
|
|
97
|
+
默认开启,支持 PV (Page View) 和 UV (User View) 自动上报。
|
|
98
|
+
|
|
99
|
+
- 自动生成/持久化 UV ID。
|
|
100
|
+
- 支持点击事件自动上报(需配置)。
|
|
101
|
+
|
|
102
|
+
#### 自动上报点击事件(Click Tracking)
|
|
21
103
|
|
|
22
|
-
|
|
23
|
-
clsLogger.put({ event: 'login', ok: true });
|
|
104
|
+
SDK 会自动监听点击事件,并上报带有 `track-id` 的元素点击。
|
|
24
105
|
|
|
25
|
-
|
|
26
|
-
clsLogger.putJson({ event: 'click', x: 1, y: 2 });
|
|
106
|
+
**Web / H5**:
|
|
27
107
|
|
|
28
|
-
|
|
29
|
-
|
|
108
|
+
在需要追踪的元素上添加 `data-track-id` 属性即可。
|
|
109
|
+
|
|
110
|
+
```html
|
|
111
|
+
<button data-track-id="submit_order_btn">提交订单</button>
|
|
112
|
+
<div data-track-id="banner_ad">广告位</div>
|
|
30
113
|
```
|
|
31
114
|
|
|
32
|
-
|
|
115
|
+
**小程序 (Mini Program)**:
|
|
33
116
|
|
|
34
|
-
|
|
117
|
+
在组件上添加 `data-track-id` 属性。
|
|
35
118
|
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
|
|
119
|
+
```html
|
|
120
|
+
<view data-track-id="product_card" bindtap="onProductClick"> 商品卡片 </view>
|
|
121
|
+
```
|
|
39
122
|
|
|
40
|
-
|
|
123
|
+
> **注意**:如果不设置 `data-track-id`,SDK 默认会忽略 `body`, `html` (Web) 或 `view`, `scroll-view` (小程序) 等容器标签的点击,避免产生大量无意义的点击日志。
|
|
41
124
|
|
|
42
|
-
|
|
125
|
+
你也可以自定义属性名(Web 默认为 `data-track-id`,小程序默认为 `data-trackId`):
|
|
43
126
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
127
|
+
```ts
|
|
128
|
+
clsLogger.init({
|
|
129
|
+
behaviorMonitor: {
|
|
130
|
+
clickTrackIdAttr: 'data-my-track-id', // Web 自定义属性名
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 高级用法
|
|
136
|
+
|
|
137
|
+
### 手动注入 SDK
|
|
47
138
|
|
|
48
|
-
|
|
139
|
+
在某些特殊构建环境(如某些不允许动态 require 的小程序框架)下,如果自动加载 SDK 失败,可以手动注入:
|
|
49
140
|
|
|
50
141
|
```ts
|
|
51
142
|
import clsLogger from '@be-link/cls-logger';
|
|
143
|
+
import * as MiniSdk from 'tencentcloud-cls-sdk-js-mini';
|
|
52
144
|
|
|
53
145
|
clsLogger.init({
|
|
54
146
|
topic_id: 'xxx',
|
|
55
|
-
|
|
56
|
-
performanceMonitor: {
|
|
57
|
-
// 降低采样(0~1)
|
|
58
|
-
sampleRate: 0.1,
|
|
59
|
-
// 忽略本地开发资源 & sourcemap(按你的资源特征调整)
|
|
60
|
-
ignoreUrls: ['localhost:8080', /\\.map$/],
|
|
61
|
-
},
|
|
62
|
-
// 可选:启动阶段合并窗口,减少首屏 perf/resource 被 intervalMs 拆成多次上报
|
|
63
|
-
// batch: { startupDelayMs: 2000 },
|
|
147
|
+
sdk: MiniSdk, // 手动传入 SDK 实例
|
|
64
148
|
});
|
|
65
149
|
```
|
package/dist/ClsLogger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClsLogger.d.ts","sourceRoot":"","sources":["../src/ClsLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,aAAa;cAC1B,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ClsLogger.d.ts","sourceRoot":"","sources":["../src/ClsLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,aAAa;cAC1B,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;CAkHjD"}
|
package/dist/ClsLoggerCore.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export declare abstract class ClsLoggerCore {
|
|
|
21
21
|
protected endpoint: string;
|
|
22
22
|
protected retryTimes: number;
|
|
23
23
|
protected source: string;
|
|
24
|
+
protected enabled: boolean;
|
|
24
25
|
protected projectId: string;
|
|
25
26
|
protected projectName: string;
|
|
26
27
|
protected appId: string;
|
|
@@ -101,9 +102,9 @@ export declare abstract class ClsLoggerCore {
|
|
|
101
102
|
*/
|
|
102
103
|
report(log: ReportLog): void;
|
|
103
104
|
private getDesiredBatchFlushDueAt;
|
|
104
|
-
info(message: string, data?: FlatFields): void;
|
|
105
|
-
warn(message: string, data?: FlatFields): void;
|
|
106
|
-
error(message: string, data?: FlatFields): void;
|
|
105
|
+
info(message: string | Error, data?: FlatFields): void;
|
|
106
|
+
warn(message: string | Error, data?: FlatFields): void;
|
|
107
|
+
error(message: string | Error, data?: FlatFields): void;
|
|
107
108
|
track(trackType: string, data?: FlatFields): void;
|
|
108
109
|
/**
|
|
109
110
|
* 立即发送内存队列
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClsLoggerCore.d.ts","sourceRoot":"","sources":["../src/ClsLoggerCore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAEpB,OAAO,EACP,UAAU,EAEV,UAAU,EACV,SAAS,EACT,SAAS,EAEV,MAAM,SAAS,CAAC;AAgBjB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAYlD;;;;;GAKG;AACH,8BAAsB,aAAa;IACjC,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAQ;IAC1C,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAQ;IAC1D,SAAS,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAQ;IAC7C,SAAS,CAAC,iBAAiB,EAAE,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAQ;IAC9E,SAAS,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,CAAQ;IAC9F,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAQ;IAC9G,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,SAAS,CAAC,QAAQ,SAAmC;IACrD,SAAS,CAAC,UAAU,SAAM;IAC1B,SAAS,CAAC,MAAM,SAAe;
|
|
1
|
+
{"version":3,"file":"ClsLoggerCore.d.ts","sourceRoot":"","sources":["../src/ClsLoggerCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behaviorMonitor.d.ts","sourceRoot":"","sources":["../src/behaviorMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG3E,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AA8FzD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,sBAA2B,GACnC,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"behaviorMonitor.d.ts","sourceRoot":"","sources":["../src/behaviorMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG3E,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AA8FzD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,sBAA2B,GACnC,MAAM,IAAI,CAiXZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorMonitor.d.ts","sourceRoot":"","sources":["../src/errorMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG/D,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"errorMonitor.d.ts","sourceRoot":"","sources":["../src/errorMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG/D,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;AA8SzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAO,GAAG,mBAAmB,GAAG,SAAc,GAAG,IAAI,CAqBhH"}
|
package/dist/index.esm.js
CHANGED
|
@@ -558,6 +558,19 @@ function getPagePath$1() {
|
|
|
558
558
|
return '';
|
|
559
559
|
}
|
|
560
560
|
}
|
|
561
|
+
function getMpPagePath() {
|
|
562
|
+
try {
|
|
563
|
+
const pages = globalThis.getCurrentPages?.();
|
|
564
|
+
if (Array.isArray(pages) && pages.length > 0) {
|
|
565
|
+
const page = pages[pages.length - 1];
|
|
566
|
+
return page.route || page.__route__ || '';
|
|
567
|
+
}
|
|
568
|
+
return '';
|
|
569
|
+
}
|
|
570
|
+
catch {
|
|
571
|
+
return '';
|
|
572
|
+
}
|
|
573
|
+
}
|
|
561
574
|
function normalizeErrorLike(err, maxTextLength) {
|
|
562
575
|
if (err && typeof err === 'object') {
|
|
563
576
|
const anyErr = err;
|
|
@@ -717,6 +730,7 @@ function installMiniProgramErrorMonitor(report, options) {
|
|
|
717
730
|
return;
|
|
718
731
|
const e = normalizeErrorLike(msg, options.maxTextLength);
|
|
719
732
|
const payload = {
|
|
733
|
+
pagePath: getMpPagePath(),
|
|
720
734
|
source: 'wx.onError',
|
|
721
735
|
message: e.message,
|
|
722
736
|
errorName: e.name,
|
|
@@ -743,6 +757,7 @@ function installMiniProgramErrorMonitor(report, options) {
|
|
|
743
757
|
return;
|
|
744
758
|
const e = normalizeErrorLike(res?.reason, options.maxTextLength);
|
|
745
759
|
const payload = {
|
|
760
|
+
pagePath: getMpPagePath(),
|
|
746
761
|
source: 'wx.onUnhandledRejection',
|
|
747
762
|
message: e.message,
|
|
748
763
|
errorName: e.name,
|
|
@@ -774,6 +789,7 @@ function installMiniProgramErrorMonitor(report, options) {
|
|
|
774
789
|
if (sampleHit$1(options.sampleRate)) {
|
|
775
790
|
const e = normalizeErrorLike(args?.[0], options.maxTextLength);
|
|
776
791
|
const payload = {
|
|
792
|
+
pagePath: getMpPagePath(),
|
|
777
793
|
source: 'App.onError',
|
|
778
794
|
message: e.message,
|
|
779
795
|
errorName: e.name,
|
|
@@ -797,6 +813,7 @@ function installMiniProgramErrorMonitor(report, options) {
|
|
|
797
813
|
const reason = args?.[0]?.reason ?? args?.[0];
|
|
798
814
|
const e = normalizeErrorLike(reason, options.maxTextLength);
|
|
799
815
|
const payload = {
|
|
816
|
+
pagePath: getMpPagePath(),
|
|
800
817
|
source: 'App.onUnhandledRejection',
|
|
801
818
|
message: e.message,
|
|
802
819
|
errorName: e.name,
|
|
@@ -1104,18 +1121,28 @@ function installMiniProgramPerformanceMonitor(report, options) {
|
|
|
1104
1121
|
continue;
|
|
1105
1122
|
// Page Render: firstRender
|
|
1106
1123
|
if (entry.entryType === 'render' && entry.name === 'firstRender') {
|
|
1124
|
+
const duration = typeof entry.duration === 'number'
|
|
1125
|
+
? entry.duration
|
|
1126
|
+
: typeof entry.startTime === 'number' && typeof entry.endTime === 'number'
|
|
1127
|
+
? entry.endTime - entry.startTime
|
|
1128
|
+
: 0;
|
|
1107
1129
|
report(options.reportType, {
|
|
1108
1130
|
metric: 'page-render',
|
|
1109
|
-
duration
|
|
1131
|
+
duration,
|
|
1110
1132
|
pagePath: entry.path || '',
|
|
1111
1133
|
unit: 'ms',
|
|
1112
1134
|
});
|
|
1113
1135
|
}
|
|
1114
1136
|
// Route Switch: route
|
|
1115
1137
|
else if (entry.entryType === 'navigation' && entry.name === 'route') {
|
|
1138
|
+
const duration = typeof entry.duration === 'number'
|
|
1139
|
+
? entry.duration
|
|
1140
|
+
: typeof entry.startTime === 'number' && typeof entry.endTime === 'number'
|
|
1141
|
+
? entry.endTime - entry.startTime
|
|
1142
|
+
: 0;
|
|
1116
1143
|
report(options.reportType, {
|
|
1117
1144
|
metric: 'route',
|
|
1118
|
-
duration
|
|
1145
|
+
duration,
|
|
1119
1146
|
pagePath: entry.path || '',
|
|
1120
1147
|
unit: 'ms',
|
|
1121
1148
|
});
|
|
@@ -1459,7 +1486,7 @@ function installBehaviorMonitor(report, envType, options = {}) {
|
|
|
1459
1486
|
const tag = (el.tagName || '').toLowerCase();
|
|
1460
1487
|
const trackId = getAttr(el, clickTrackIdAttr);
|
|
1461
1488
|
// 过滤无效点击:白名单 tag + 没有 trackId
|
|
1462
|
-
if (clickWhiteList.includes(tag)
|
|
1489
|
+
if (clickWhiteList.includes(tag) || !trackId)
|
|
1463
1490
|
return;
|
|
1464
1491
|
void uvStatePromise.then(({ uvId, meta }) => {
|
|
1465
1492
|
if (destroyed)
|
|
@@ -1500,8 +1527,12 @@ function installBehaviorMonitor(report, envType, options = {}) {
|
|
|
1500
1527
|
g.Page = function patchedPage(conf) {
|
|
1501
1528
|
const originalOnShow = conf?.onShow;
|
|
1502
1529
|
conf.onShow = function (...args) {
|
|
1503
|
-
if (pvEnabled)
|
|
1504
|
-
|
|
1530
|
+
if (pvEnabled) {
|
|
1531
|
+
const pagePath = getPagePath();
|
|
1532
|
+
if (pagePath?.length > 0) {
|
|
1533
|
+
reportPv(pagePath);
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1505
1536
|
return typeof originalOnShow === 'function' ? originalOnShow.apply(this, args) : undefined;
|
|
1506
1537
|
};
|
|
1507
1538
|
// 点击:wrap 页面 methods(bindtap 等会调用到这里的 handler)
|
|
@@ -1855,6 +1886,7 @@ class ClsLoggerCore {
|
|
|
1855
1886
|
this.endpoint = 'ap-shanghai.cls.tencentcs.com';
|
|
1856
1887
|
this.retryTimes = 10;
|
|
1857
1888
|
this.source = '127.0.0.1';
|
|
1889
|
+
this.enabled = true;
|
|
1858
1890
|
this.projectId = '';
|
|
1859
1891
|
this.projectName = '';
|
|
1860
1892
|
this.appId = '';
|
|
@@ -1885,9 +1917,14 @@ class ClsLoggerCore {
|
|
|
1885
1917
|
* 子类可按需重写(默认检测 wx)
|
|
1886
1918
|
*/
|
|
1887
1919
|
detectEnvType() {
|
|
1888
|
-
const
|
|
1889
|
-
|
|
1920
|
+
const g = globalThis;
|
|
1921
|
+
// 微信、支付宝、字节跳动、UniApp 等小程序环境通常都有特定全局变量
|
|
1922
|
+
if ((g.wx && typeof g.wx.getSystemInfoSync === 'function') ||
|
|
1923
|
+
(g.my && typeof g.my.getSystemInfoSync === 'function') ||
|
|
1924
|
+
(g.tt && typeof g.tt.getSystemInfoSync === 'function') ||
|
|
1925
|
+
(g.uni && typeof g.uni.getSystemInfoSync === 'function')) {
|
|
1890
1926
|
return 'miniprogram';
|
|
1927
|
+
}
|
|
1891
1928
|
return 'browser';
|
|
1892
1929
|
}
|
|
1893
1930
|
init(options) {
|
|
@@ -1925,6 +1962,7 @@ class ClsLoggerCore {
|
|
|
1925
1962
|
this.appId = options.appId ?? this.appId;
|
|
1926
1963
|
this.appVersion = options.appVersion ?? this.appVersion;
|
|
1927
1964
|
this.envType = nextEnvType;
|
|
1965
|
+
this.enabled = options.enabled ?? true;
|
|
1928
1966
|
// 可选:外部注入 SDK(优先级:sdkLoader > sdk)
|
|
1929
1967
|
this.sdkLoaderOverride = options.sdkLoader ?? this.sdkLoaderOverride;
|
|
1930
1968
|
this.sdkOverride = options.sdk ?? this.sdkOverride;
|
|
@@ -1941,15 +1979,17 @@ class ClsLoggerCore {
|
|
|
1941
1979
|
void this.getInstance().catch(() => {
|
|
1942
1980
|
// ignore
|
|
1943
1981
|
});
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1982
|
+
if (this.enabled) {
|
|
1983
|
+
// 启动时尝试发送失败缓存
|
|
1984
|
+
this.flushFailed();
|
|
1985
|
+
// 初始化后立即启动请求监听
|
|
1986
|
+
this.startRequestMonitor(options.requestMonitor);
|
|
1987
|
+
// 初始化后立即启动错误监控/性能监控
|
|
1988
|
+
this.startErrorMonitor(options.errorMonitor);
|
|
1989
|
+
this.startPerformanceMonitor(options.performanceMonitor);
|
|
1990
|
+
// 初始化后立即启动行为埋点(PV/UV/点击)
|
|
1991
|
+
this.startBehaviorMonitor(options.behaviorMonitor);
|
|
1992
|
+
}
|
|
1953
1993
|
}
|
|
1954
1994
|
getBaseFields() {
|
|
1955
1995
|
let auto = undefined;
|
|
@@ -2074,6 +2114,8 @@ class ClsLoggerCore {
|
|
|
2074
2114
|
* - 最终会把 fields 展开成 CLS 的 content(key/value 都会转成 string)
|
|
2075
2115
|
*/
|
|
2076
2116
|
put(fields, options = {}) {
|
|
2117
|
+
if (!this.enabled)
|
|
2118
|
+
return;
|
|
2077
2119
|
if (!fields)
|
|
2078
2120
|
return;
|
|
2079
2121
|
if (!this.topicId) {
|
|
@@ -2132,6 +2174,8 @@ class ClsLoggerCore {
|
|
|
2132
2174
|
* - 埋点入参必须是一维(扁平)Object,非原始值会被 stringify
|
|
2133
2175
|
*/
|
|
2134
2176
|
enqueue(fields, options = {}) {
|
|
2177
|
+
if (!this.enabled)
|
|
2178
|
+
return;
|
|
2135
2179
|
if (!fields)
|
|
2136
2180
|
return;
|
|
2137
2181
|
const time = Date.now();
|
|
@@ -2170,6 +2214,8 @@ class ClsLoggerCore {
|
|
|
2170
2214
|
* 批量上报(每条 item.data 展开为 log content)
|
|
2171
2215
|
*/
|
|
2172
2216
|
putBatch(queue) {
|
|
2217
|
+
if (!this.enabled)
|
|
2218
|
+
return;
|
|
2173
2219
|
if (!queue || queue.length === 0)
|
|
2174
2220
|
return;
|
|
2175
2221
|
if (!this.topicId) {
|
|
@@ -2213,6 +2259,8 @@ class ClsLoggerCore {
|
|
|
2213
2259
|
* 参考《一、概述》:统一上报入口(内存队列 + 批量发送)
|
|
2214
2260
|
*/
|
|
2215
2261
|
report(log) {
|
|
2262
|
+
if (!this.enabled)
|
|
2263
|
+
return;
|
|
2216
2264
|
if (!log?.type)
|
|
2217
2265
|
return;
|
|
2218
2266
|
if (!this.topicId) {
|
|
@@ -2260,15 +2308,57 @@ class ClsLoggerCore {
|
|
|
2260
2308
|
return nowTs + this.batchIntervalMs;
|
|
2261
2309
|
}
|
|
2262
2310
|
info(message, data = {}) {
|
|
2263
|
-
|
|
2311
|
+
let msg = '';
|
|
2312
|
+
let extra = {};
|
|
2313
|
+
if (message instanceof Error) {
|
|
2314
|
+
msg = message.message;
|
|
2315
|
+
extra = {
|
|
2316
|
+
stack: message.stack,
|
|
2317
|
+
name: message.name,
|
|
2318
|
+
...data,
|
|
2319
|
+
};
|
|
2320
|
+
}
|
|
2321
|
+
else {
|
|
2322
|
+
msg = String(message);
|
|
2323
|
+
extra = data;
|
|
2324
|
+
}
|
|
2325
|
+
const payload = normalizeFlatFields({ message: msg, ...extra }, 'info');
|
|
2264
2326
|
this.report({ type: 'info', data: payload, timestamp: Date.now() });
|
|
2265
2327
|
}
|
|
2266
2328
|
warn(message, data = {}) {
|
|
2267
|
-
|
|
2329
|
+
let msg = '';
|
|
2330
|
+
let extra = {};
|
|
2331
|
+
if (message instanceof Error) {
|
|
2332
|
+
msg = message.message;
|
|
2333
|
+
extra = {
|
|
2334
|
+
stack: message.stack,
|
|
2335
|
+
name: message.name,
|
|
2336
|
+
...data,
|
|
2337
|
+
};
|
|
2338
|
+
}
|
|
2339
|
+
else {
|
|
2340
|
+
msg = String(message);
|
|
2341
|
+
extra = data;
|
|
2342
|
+
}
|
|
2343
|
+
const payload = normalizeFlatFields({ message: msg, ...extra }, 'warn');
|
|
2268
2344
|
this.report({ type: 'warn', data: payload, timestamp: Date.now() });
|
|
2269
2345
|
}
|
|
2270
2346
|
error(message, data = {}) {
|
|
2271
|
-
|
|
2347
|
+
let msg = '';
|
|
2348
|
+
let extra = {};
|
|
2349
|
+
if (message instanceof Error) {
|
|
2350
|
+
msg = message.message;
|
|
2351
|
+
extra = {
|
|
2352
|
+
stack: message.stack,
|
|
2353
|
+
name: message.name,
|
|
2354
|
+
...data,
|
|
2355
|
+
};
|
|
2356
|
+
}
|
|
2357
|
+
else {
|
|
2358
|
+
msg = String(message);
|
|
2359
|
+
extra = data;
|
|
2360
|
+
}
|
|
2361
|
+
const payload = normalizeFlatFields({ message: msg, ...extra }, 'error');
|
|
2272
2362
|
this.report({ type: 'error', data: payload, timestamp: Date.now() });
|
|
2273
2363
|
}
|
|
2274
2364
|
track(trackType, data = {}) {
|
|
@@ -2375,6 +2465,8 @@ class ClsLoggerCore {
|
|
|
2375
2465
|
writeStringStorage(this.failedCacheKey, JSON.stringify(next));
|
|
2376
2466
|
}
|
|
2377
2467
|
flushFailed() {
|
|
2468
|
+
if (!this.enabled)
|
|
2469
|
+
return;
|
|
2378
2470
|
const raw = readStringStorage(this.failedCacheKey);
|
|
2379
2471
|
if (!raw)
|
|
2380
2472
|
return;
|
|
@@ -2490,38 +2582,78 @@ class ClsLogger extends ClsLoggerCore {
|
|
|
2490
2582
|
}
|
|
2491
2583
|
}
|
|
2492
2584
|
const isMini = this.envType === 'miniprogram';
|
|
2493
|
-
//
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2585
|
+
// 3) 尝试 require / 全局变量
|
|
2586
|
+
// Mini Program: 尝试直接 require
|
|
2587
|
+
if (isMini) {
|
|
2588
|
+
// 显式使用字面量 require,帮助打包工具识别依赖(尤其是 CJS 构建模式下)
|
|
2589
|
+
try {
|
|
2590
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
2591
|
+
const req = typeof require === 'function' ? require('tencentcloud-cls-sdk-js-mini') : null;
|
|
2592
|
+
const reqSdk = normalizeSdk(req);
|
|
2593
|
+
if (reqSdk) {
|
|
2594
|
+
this.sdk = reqSdk;
|
|
2595
|
+
return reqSdk;
|
|
2596
|
+
}
|
|
2597
|
+
}
|
|
2598
|
+
catch {
|
|
2599
|
+
// ignore
|
|
2600
|
+
}
|
|
2601
|
+
// 尝试使用 tryRequire(作为补充)
|
|
2602
|
+
const reqMod = tryRequire('tencentcloud-cls-sdk-js-mini');
|
|
2603
|
+
const reqSdk = normalizeSdk(reqMod);
|
|
2604
|
+
if (reqSdk) {
|
|
2605
|
+
this.sdk = reqSdk;
|
|
2606
|
+
return reqSdk;
|
|
2607
|
+
}
|
|
2608
|
+
}
|
|
2609
|
+
else {
|
|
2610
|
+
// Web: 优先读全局变量 (UMD)
|
|
2498
2611
|
const g = readGlobal('tencentcloudClsSdkJsWeb');
|
|
2499
2612
|
const sdk = normalizeSdk(g);
|
|
2500
2613
|
if (sdk) {
|
|
2501
2614
|
this.sdk = sdk;
|
|
2502
2615
|
return sdk;
|
|
2503
2616
|
}
|
|
2617
|
+
// Web: 尝试 require
|
|
2618
|
+
const reqMod = tryRequire('tencentcloud-cls-sdk-js-web');
|
|
2619
|
+
const reqSdk = normalizeSdk(reqMod);
|
|
2620
|
+
if (reqSdk) {
|
|
2621
|
+
this.sdk = reqSdk;
|
|
2622
|
+
return reqSdk;
|
|
2623
|
+
}
|
|
2624
|
+
}
|
|
2625
|
+
// 4) 动态 import
|
|
2626
|
+
// 使用字符串字面量,确保 Bundler 能正确识别并进行 Code Splitting
|
|
2627
|
+
if (isMini) {
|
|
2628
|
+
this.sdkPromise = import('tencentcloud-cls-sdk-js-mini')
|
|
2629
|
+
.then((m) => {
|
|
2630
|
+
const sdk = normalizeSdk(m);
|
|
2631
|
+
if (!sdk)
|
|
2632
|
+
throw new Error(`ClsLogger.loadSdk: invalid sdk module for mini`);
|
|
2633
|
+
this.sdk = sdk;
|
|
2634
|
+
return sdk;
|
|
2635
|
+
})
|
|
2636
|
+
.catch((err) => {
|
|
2637
|
+
this.sdkPromise = null;
|
|
2638
|
+
console.error('[ClsLogger] Failed to load mini sdk:', err);
|
|
2639
|
+
throw err;
|
|
2640
|
+
});
|
|
2641
|
+
}
|
|
2642
|
+
else {
|
|
2643
|
+
this.sdkPromise = import('tencentcloud-cls-sdk-js-web')
|
|
2644
|
+
.then((m) => {
|
|
2645
|
+
const sdk = normalizeSdk(m);
|
|
2646
|
+
if (!sdk)
|
|
2647
|
+
throw new Error(`ClsLogger.loadSdk: invalid sdk module for web`);
|
|
2648
|
+
this.sdk = sdk;
|
|
2649
|
+
return sdk;
|
|
2650
|
+
})
|
|
2651
|
+
.catch((err) => {
|
|
2652
|
+
this.sdkPromise = null;
|
|
2653
|
+
console.error('[ClsLogger] Failed to load web sdk:', err);
|
|
2654
|
+
throw err;
|
|
2655
|
+
});
|
|
2504
2656
|
}
|
|
2505
|
-
// 尽量同步 require
|
|
2506
|
-
const reqMod = tryRequire(isMini ? MINI_SDK : WEB_SDK);
|
|
2507
|
-
const reqSdk = normalizeSdk(reqMod);
|
|
2508
|
-
if (reqSdk) {
|
|
2509
|
-
this.sdk = reqSdk;
|
|
2510
|
-
return reqSdk;
|
|
2511
|
-
}
|
|
2512
|
-
// 动态 import
|
|
2513
|
-
this.sdkPromise = (isMini ? import(MINI_SDK) : import(WEB_SDK))
|
|
2514
|
-
.then((m) => {
|
|
2515
|
-
const sdk = normalizeSdk(m);
|
|
2516
|
-
if (!sdk)
|
|
2517
|
-
throw new Error(`ClsLogger.loadSdk: invalid sdk module for ${isMini ? MINI_SDK : WEB_SDK}`);
|
|
2518
|
-
this.sdk = sdk;
|
|
2519
|
-
return sdk;
|
|
2520
|
-
})
|
|
2521
|
-
.catch((err) => {
|
|
2522
|
-
this.sdkPromise = null;
|
|
2523
|
-
throw err;
|
|
2524
|
-
});
|
|
2525
2657
|
return this.sdkPromise;
|
|
2526
2658
|
}
|
|
2527
2659
|
}
|