@aigc-kino/logger-sdk 1.3.0
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 +280 -0
- package/dist/index.cjs +841 -0
- package/dist/index.d.cts +194 -0
- package/dist/index.d.ts +194 -0
- package/dist/index.global.js +824 -0
- package/dist/index.js +799 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Logger SDK 使用文档
|
|
2
|
+
|
|
3
|
+
> `@aigc-kino/logger-sdk` — 前端日志采集 SDK(TypeScript)
|
|
4
|
+
>
|
|
5
|
+
> 支持异常监控、性能监控、网络监控、用户行为、业务日志、qiankun 微前端。
|
|
6
|
+
|
|
7
|
+
## 1. 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @aigc-kino/logger-sdk
|
|
11
|
+
# 或
|
|
12
|
+
npm install @aigc-kino/logger-sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
CDN 方式:
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<!-- 建议锁定版本并启用 SRI 完整性校验,防止 CDN 被篡改 -->
|
|
19
|
+
<script
|
|
20
|
+
src="https://cdn.example.com/logger-sdk/1.0.0/index.umd.js"
|
|
21
|
+
integrity="sha384-<构建时生成的哈希>"
|
|
22
|
+
crossorigin="anonymous"
|
|
23
|
+
></script>
|
|
24
|
+
<script>
|
|
25
|
+
LoggerSDK.init({ projectId: 'kino-log-platfrom', token: 'YOUR_TOKEN' })
|
|
26
|
+
</script>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 2. 快速开始
|
|
30
|
+
|
|
31
|
+
在应用入口尽早初始化(建议在所有业务代码之前):
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { init } from '@aigc-kino/logger-sdk'
|
|
35
|
+
|
|
36
|
+
init({
|
|
37
|
+
projectId: 'kino-log-platfrom', // 必填:项目 ID(Admin 后台创建)
|
|
38
|
+
token: 'YOUR_TOKEN', // 必填:上报 Token
|
|
39
|
+
serverUrl: 'https://log.example.com', // 必填:网关地址
|
|
40
|
+
env: 'production', // 环境:development / test / production
|
|
41
|
+
version: '2.1.0', // 应用版本,需与 SourceMap 上传版本一致
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
初始化后 SDK 自动采集:JS 错误、Promise 错误、资源错误、fetch 请求、性能指标、PV。
|
|
46
|
+
|
|
47
|
+
## 3. 完整配置项
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
init({
|
|
51
|
+
// ---- 基础(必填) ----
|
|
52
|
+
projectId: 'kino-log-platfrom',
|
|
53
|
+
token: 'YOUR_TOKEN',
|
|
54
|
+
serverUrl: 'https://log.example.com',
|
|
55
|
+
|
|
56
|
+
// ---- 基础(可选) ----
|
|
57
|
+
env: 'production',
|
|
58
|
+
version: '2.1.0',
|
|
59
|
+
userId: '10001', // 也可稍后通过 setUser 设置
|
|
60
|
+
|
|
61
|
+
// ---- 采集开关 ----
|
|
62
|
+
enableError: true, // JS/Promise/资源错误
|
|
63
|
+
enablePerformance: true, // LCP、FCP 等性能指标
|
|
64
|
+
enableBehavior: true, // 点击、路由等用户行为
|
|
65
|
+
enableNetwork: true, // fetch/axios 请求
|
|
66
|
+
enableConsole: false, // console.error/warn 采集
|
|
67
|
+
|
|
68
|
+
// ---- 上报策略 ----
|
|
69
|
+
sampleRate: 1, // 采样率 0~1
|
|
70
|
+
batchSize: 50, // 批量上报条数阈值
|
|
71
|
+
uploadInterval: 5000, // 上报间隔(ms)
|
|
72
|
+
maxRetry: 3, // 失败重试次数
|
|
73
|
+
ignoreErrors: [ // 忽略的错误(字符串或正则)
|
|
74
|
+
'ResizeObserver loop',
|
|
75
|
+
/Script error/,
|
|
76
|
+
],
|
|
77
|
+
ignoreUrls: [/\/api\/heartbeat/], // 忽略采集的请求 URL
|
|
78
|
+
|
|
79
|
+
// ---- 钩子 ----
|
|
80
|
+
beforeSend(log) { // 上报前拦截/加工,返回 false 丢弃
|
|
81
|
+
if (log.message?.includes('password')) return false
|
|
82
|
+
// 页面地址脱敏:仅掩码敏感 query 参数,保留非敏感 query 与 hash(推荐,避免页面地址不完整)
|
|
83
|
+
log.url = scrubUrl(log.url)
|
|
84
|
+
return log
|
|
85
|
+
},
|
|
86
|
+
})
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
> 说明:`sampleRate`、`ignoreErrors`、`uploadInterval`、`batchSize` 等支持在 Admin 后台「SDK 配置中心」动态下发,远端配置优先级高于本地。
|
|
90
|
+
|
|
91
|
+
## 4. 框架接入
|
|
92
|
+
|
|
93
|
+
### 4.1 Vue3
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { createApp } from 'vue'
|
|
97
|
+
import { init, VuePlugin } from '@aigc-kino/logger-sdk'
|
|
98
|
+
import App from './App.vue'
|
|
99
|
+
|
|
100
|
+
init({ projectId: 'kino-log-platfrom', token: 'YOUR_TOKEN', serverUrl: 'https://log.example.com' })
|
|
101
|
+
|
|
102
|
+
const app = createApp(App)
|
|
103
|
+
app.use(VuePlugin) // 采集 Vue 组件错误(含组件名、props 摘要)
|
|
104
|
+
app.mount('#app')
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
> 路由 PV 已由内置页面插件自动采集:SDK 劫持 `history.pushState`/`replaceState`/`popstate`/`hashchange`,在 SPA 路由变更时自动上报 `type=page` 的 PV 日志,**无需也不存在 `RouterPlugin`**。若需在主日志中附带当前路由字段,设置 `microFrontend: { hostApp }` 即可(见第 6 节)。
|
|
108
|
+
|
|
109
|
+
### 4.2 Axios
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
import axios from 'axios'
|
|
113
|
+
import { attachAxios } from '@aigc-kino/logger-sdk'
|
|
114
|
+
|
|
115
|
+
attachAxios(axios) // 采集请求 URL、状态码、耗时、失败原因
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 5. API
|
|
119
|
+
|
|
120
|
+
### 5.1 用户与会话
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import { clearUser, setUser, setTag, getSessionId, getTraceId } from '@aigc-kino/logger-sdk'
|
|
124
|
+
|
|
125
|
+
setUser('10001') // 兼容旧用法:只设置用户 ID
|
|
126
|
+
setUser('10001', {
|
|
127
|
+
nickname: 'Alice',
|
|
128
|
+
email: 'alice@example.com',
|
|
129
|
+
phone: '13800000000',
|
|
130
|
+
avatar: 'https://example.com/avatar.png',
|
|
131
|
+
custom: { plan: 'pro', region: 'cn-east' },
|
|
132
|
+
})
|
|
133
|
+
clearUser() // 退出登录时解除后续日志的用户关联
|
|
134
|
+
setTag('channel', 'app') // 附加全局标签(写入 extra)
|
|
135
|
+
const sessionId = getSessionId() // 当前会话 ID
|
|
136
|
+
const traceId = getTraceId() // 当前 Trace ID
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
用户资料由固定基础字段 `nickname`、`email`、`phone`、`avatar` 和 `custom` 扩展对象组成。部分更新时,未提供的字段保留服务端旧值;显式传入 `null` 会清除对应字段;非空 `custom` 每次整体替换,不做深层合并,`custom: null` 会清空扩展对象。`clearUser()` 只清除 SDK 当前关联,不删除服务端已保存的资料。
|
|
140
|
+
|
|
141
|
+
资料上报设置 5 秒超时,失败不会阻塞日志采集。SDK 仅在初始化配置启用 `debug` 时输出诊断信息,诊断信息不会包含项目 Token 或用户资料。SDK 不会自动采集姓名、邮箱、手机号等个人信息;接入方必须在取得合法授权并满足适用隐私与合规要求后,才可显式传入这些字段。
|
|
142
|
+
|
|
143
|
+
### 5.2 业务日志
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { track } from '@aigc-kino/logger-sdk'
|
|
147
|
+
|
|
148
|
+
track('order-paid', { // type=business
|
|
149
|
+
orderId: 'O20260731001',
|
|
150
|
+
amount: 99,
|
|
151
|
+
})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 5.3 手动上报
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
import { captureError, captureMessage } from '@aigc-kino/logger-sdk'
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
riskyOperation()
|
|
161
|
+
} catch (e) {
|
|
162
|
+
captureError(e, { scene: 'checkout' }) // type=js-error,extra 附加上下文
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
captureMessage('库存同步延迟', 'warn') // type=custom
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 5.4 立即上报与销毁
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
import { flush, destroy } from '@aigc-kino/logger-sdk'
|
|
172
|
+
|
|
173
|
+
await flush() // 立即上报缓存中全部日志
|
|
174
|
+
destroy() // 移除全部监听器并清理(SPA 子应用卸载时调用)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 5.5 页面地址脱敏
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
import { scrubUrl } from '@aigc-kino/logger-sdk'
|
|
181
|
+
|
|
182
|
+
// 仅掩码敏感 query 参数(token/password/phone 等)的值,保留非敏感 query 与 hash
|
|
183
|
+
scrubUrl('https://a.com/detail?id=1&token=xx#/edit?tab=2')
|
|
184
|
+
// => 'https://a.com/detail?id=1&token=***#/edit?tab=2'
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
> 脱敏请在 `beforeSend` 中使用 `scrubUrl`,**不要**直接 `url.search = ''` 全量剥离 query/hash,否则日志中的页面地址会丢失路由参数、无法定位页面。
|
|
188
|
+
|
|
189
|
+
## 6. qiankun 微前端接入
|
|
190
|
+
|
|
191
|
+
主应用:
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
init({
|
|
195
|
+
projectId: 'portal',
|
|
196
|
+
token: 'PORTAL_TOKEN',
|
|
197
|
+
serverUrl: 'https://log.example.com',
|
|
198
|
+
microFrontend: { hostApp: 'portal' },
|
|
199
|
+
})
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
子应用:
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
init({
|
|
206
|
+
projectId: 'editor',
|
|
207
|
+
token: 'EDITOR_TOKEN',
|
|
208
|
+
serverUrl: 'https://log.example.com',
|
|
209
|
+
microFrontend: {
|
|
210
|
+
hostApp: 'portal',
|
|
211
|
+
microApp: 'editor',
|
|
212
|
+
container: '#subapp',
|
|
213
|
+
},
|
|
214
|
+
})
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
- 日志自动附加 `hostApp`、`microApp`、`route`、`container` 字段;
|
|
218
|
+
- 主/子应用共享 `traceId`,可在 Admin 中跨应用关联查询;
|
|
219
|
+
- 子应用卸载生命周期中调用 `destroy()` 防止内存泄漏。
|
|
220
|
+
|
|
221
|
+
## 7. SourceMap 上传(配合错误定位)
|
|
222
|
+
|
|
223
|
+
构建后将 `.map` 文件上传到平台(勿部署到线上 CDN):
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
curl -X POST https://log.example.com/api/sourcemap/upload \
|
|
227
|
+
-H "Authorization: Bearer YOUR_TOKEN" \
|
|
228
|
+
-F "project=kino-log-platfrom" \
|
|
229
|
+
-F "version=2.1.0" \
|
|
230
|
+
-F "file=@dist/assets/main.63df3.js.map"
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
> `version` 必须与 `init({ version })` 一致,否则堆栈无法解析到源码。
|
|
234
|
+
|
|
235
|
+
上传后异常中心展示效果:
|
|
236
|
+
|
|
237
|
+
```text
|
|
238
|
+
原始: main.63df3.js:10982:12
|
|
239
|
+
解析: src/views/Home.vue line 132 column 18(支持源码预览)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## 8. 上报机制说明
|
|
243
|
+
|
|
244
|
+
```text
|
|
245
|
+
采集 → 标准化 → IndexedDB 缓存 → 批量上报(fetch keepalive)
|
|
246
|
+
↓ 失败
|
|
247
|
+
重试(maxRetry)
|
|
248
|
+
页面卸载 → sendBeacon 兜底上报
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
- 达到 `batchSize` 或到达 `uploadInterval` 即触发一次批量上报;
|
|
252
|
+
- 断网/失败日志持久化在 IndexedDB,恢复后自动补报,不重复;
|
|
253
|
+
- SDK 自身上报请求不会被网络采集(防循环)。
|
|
254
|
+
|
|
255
|
+
## 9. 日志字段参考
|
|
256
|
+
|
|
257
|
+
| 字段 | 说明 | 来源 |
|
|
258
|
+
|------|------|------|
|
|
259
|
+
| projectId / env / version | 项目标识 | init 配置 |
|
|
260
|
+
| type / level / message / stack | 日志内容 | 自动采集或手动 API |
|
|
261
|
+
| url | 页面地址 | 自动 |
|
|
262
|
+
| userId | 用户 ID | setUser |
|
|
263
|
+
| sessionId / traceId | 会话 / 链路 | 自动生成 |
|
|
264
|
+
| browser / device / network | 环境信息 | 自动解析 |
|
|
265
|
+
| timestamp | 毫秒时间戳 | 自动 |
|
|
266
|
+
| extra | 扩展字段 | setTag / track / capture* |
|
|
267
|
+
|
|
268
|
+
## 10. 常见问题(FAQ)
|
|
269
|
+
|
|
270
|
+
**Q:日志没有上报?**
|
|
271
|
+
依次检查:`projectId`/`token` 是否正确 → 网关地址可达 → 是否被 `sampleRate`/`ignoreErrors` 过滤 → Network 面板中 `/api/log/upload` 响应是否为 `{"success":true}`。
|
|
272
|
+
|
|
273
|
+
**Q:Script error 无堆栈?**
|
|
274
|
+
跨域脚本需在 `<script>` 上加 `crossorigin="anonymous"`,且 CDN 响应头包含 `Access-Control-Allow-Origin`。
|
|
275
|
+
|
|
276
|
+
**Q:错误堆栈未解析为源码?**
|
|
277
|
+
确认对应 `version` 的 sourcemap 已上传,且构建产物 hash 与 map 文件匹配。
|
|
278
|
+
|
|
279
|
+
**Q:如何临时关闭采集?**
|
|
280
|
+
Admin 后台将该项目 `sampleRate` 设为 0,SDK 拉取配置后即停止上报,无需发版。
|