{"_id":"@aigc-kino/logger-sdk","_rev":"7-1f901a2cf0be66bec2c877930d932b2c","name":"@aigc-kino/logger-sdk","dist-tags":{"latest":"1.3.6"},"versions":{"1.3.0":{"name":"@aigc-kino/logger-sdk","version":"1.3.0","license":"MIT","_id":"@aigc-kino/logger-sdk@1.3.0","maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"homepage":"https://vkino.cn","dist":{"shasum":"aa9bc191c4d474892c3a905a872ba5c669fd9afb","tarball":"https://registry.npmjs.org/@aigc-kino/logger-sdk/-/logger-sdk-1.3.0.tgz","fileCount":7,"integrity":"sha512-nSe5S8VH6spA9p5LF8jXQmj0rVutZk7zNwCbyPAR5mIUIst+PEyOOneSaXaZfx6EC2d+rsDLcp8yvWfoFurTrw==","signatures":[{"sig":"MEYCIQDKaURfDpS6hvwB3MElWD8wTfYVLibH8XBBteuTY2pSCAIhAO9R7BV7fCzLcMauHOLN5KMVKqItvtRnWvPEbr17EpCK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106460},"main":"./dist/index.cjs","type":"module","_from":"file:aigc-kino-logger-sdk-1.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"node build-sdk.mjs","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"jwzx","email":"15850507505@163.com"},"_resolved":"C:\\Users\\admin\\AppData\\Local\\Temp\\2f3233b49626db5d5df5d3b44e7b1a6c\\aigc-kino-logger-sdk-1.3.0.tgz","_integrity":"sha512-nSe5S8VH6spA9p5LF8jXQmj0rVutZk7zNwCbyPAR5mIUIst+PEyOOneSaXaZfx6EC2d+rsDLcp8yvWfoFurTrw==","_npmVersion":"10.9.0","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/logger-sdk_1.3.0_1787049674056_0.02635761011670512","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@aigc-kino/logger-sdk","version":"1.3.1","license":"MIT","_id":"@aigc-kino/logger-sdk@1.3.1","maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"homepage":"https://vkino.cn","dist":{"shasum":"13e2445cb904c74f98031ee364cee284dd2752d2","tarball":"https://registry.npmjs.org/@aigc-kino/logger-sdk/-/logger-sdk-1.3.1.tgz","fileCount":7,"integrity":"sha512-aHv6GWFIBVqrFGzQOgruPXpf3UsyHLS6CtKU2kORW/NewNdJ5ch296vkc1CUCWM1WeJ5oVLarxmW4KdwfLE5oA==","signatures":[{"sig":"MEQCIAVe43kZ3jXgyAk4qgiWYAisyjkKllTRdnkQFYBLSB0jAiAQXl9y/ReEJnb4lgiSTuyQ5esv1NoBBoEsn1xFwrfjtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110173},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"e96fa10efd51e33996fbd16e13ce120e5a4e6b36","scripts":{"build":"node build-sdk.mjs","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jwzx","email":"15850507505@163.com"},"_npmVersion":"10.9.0","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/logger-sdk_1.3.1_1787720877182_0.2922347093040101","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@aigc-kino/logger-sdk","version":"1.3.2","license":"MIT","_id":"@aigc-kino/logger-sdk@1.3.2","maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"homepage":"https://vkino.cn","dist":{"shasum":"66fe47a7dd885ef32d015147334c597ee09f67ac","tarball":"https://registry.npmjs.org/@aigc-kino/logger-sdk/-/logger-sdk-1.3.2.tgz","fileCount":7,"integrity":"sha512-VHZQp3sN1Etxp56AdFo3Mt+5vtLvikcZigMxtTwGc/iycItoX8PP4DeGhV3VAVPBy4KyXZ6Li8/ykNoQAXU++g==","signatures":[{"sig":"MEYCIQDq1uSYgGLP8YYuz8PBcDOmDfPDgbHS/TVi6I7aI+c6qgIhAP470paPjNx5AEMEXYPyJE26akCVNxFRqXk/JYLFkp+D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119197},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"79ec5c8ffe3e1fa03cc2d827233706c07416d101","scripts":{"build":"node build-sdk.mjs","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jwzx","email":"15850507505@163.com"},"_npmVersion":"10.9.0","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/logger-sdk_1.3.2_1788168241324_0.8284892740196064","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@aigc-kino/logger-sdk","version":"1.3.3","license":"MIT","_id":"@aigc-kino/logger-sdk@1.3.3","maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"homepage":"https://vkino.cn","dist":{"shasum":"2725a03df5c1691b6966276bfc2fa388d2341d36","tarball":"https://registry.npmjs.org/@aigc-kino/logger-sdk/-/logger-sdk-1.3.3.tgz","fileCount":7,"integrity":"sha512-/bA7Dh1xHXZLoJaXfngS/RRThxMFOLsyqaw1OyM0pYtlz9V4Zq68hvVQyvfUncRFUVPnVsjEpaaMbXNCxFgaNg==","signatures":[{"sig":"MEUCIQDMrh3Egn/Zo7Siq4e0KtxYcYLAHfqMPk/9D20azKgi8wIgG+ylEP+LVRaYCERLLTTzqHpCJFzytQ0BHmY0Yo0LUA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":119949},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"79ec5c8ffe3e1fa03cc2d827233706c07416d101","scripts":{"build":"node build-sdk.mjs","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jwzx","email":"15850507505@163.com"},"_npmVersion":"10.9.0","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/logger-sdk_1.3.3_1788170665539_0.9308489153703008","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@aigc-kino/logger-sdk","version":"1.3.4","license":"MIT","_id":"@aigc-kino/logger-sdk@1.3.4","maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"homepage":"https://vkino.cn","dist":{"shasum":"268171bbc119db93eb0c7a1b5d9d1040c8dd1dda","tarball":"https://registry.npmjs.org/@aigc-kino/logger-sdk/-/logger-sdk-1.3.4.tgz","fileCount":7,"integrity":"sha512-BVQRDppnH6mqYvh6OO/qXKTBX1Rcx+JI4Gs1V/E18KBYc6EcnfYQp5yo/41HP0jKpgrI3r/Yw25xSYWHXCNVsg==","signatures":[{"sig":"MEUCIE9xR/LqULKbtUyUkECtPy90H0Q1v145edIg4mOmuxUdAiEA+Ehm2gRCWhS8NrhfiyGq2I67/8YvhSXIMb9yFnknJcM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125284},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"79ec5c8ffe3e1fa03cc2d827233706c07416d101","scripts":{"build":"node build-sdk.mjs","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jwzx","email":"15850507505@163.com"},"_npmVersion":"10.9.0","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/logger-sdk_1.3.4_1788172994982_0.6561976844831612","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@aigc-kino/logger-sdk","version":"1.3.5","license":"MIT","_id":"@aigc-kino/logger-sdk@1.3.5","maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"homepage":"https://vkino.cn","dist":{"shasum":"3a42f1909fc1b0f027c9a15bdf7e6ab5267c6fab","tarball":"https://registry.npmjs.org/@aigc-kino/logger-sdk/-/logger-sdk-1.3.5.tgz","fileCount":7,"integrity":"sha512-wa66VdXyhZE+2iav3Tzt6Ttf4J7HX2sF0xcTf8sZnt861KDRKXpBJGeOq5pA31D7b9iStlbbz/adSmOU/LMmTw==","signatures":[{"sig":"MEUCIFgCpJrAUCzLzzmubpEXlhdsh+Lrsjm3feZycUsE+bOqAiEAhzgGI/2PN4PO2NyVw4FlV9TH4CN5hOqvm56/QvwOb7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134125},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"07c41d11cb4a49e03e38956f187d3f3f17ff25a6","scripts":{"build":"node build-sdk.mjs","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jwzx","email":"15850507505@163.com"},"_npmVersion":"10.9.0","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","typescript":"^5.6.3"},"_npmOperationalInternal":{"tmp":"tmp/logger-sdk_1.3.5_1788353960521_0.5752615112434454","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@aigc-kino/logger-sdk","version":"1.3.6","type":"module","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","license":"MIT","homepage":"https://vkino.cn","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"scripts":{"build":"node build-sdk.mjs","test":"pnpm exec tsx src/plugins/network.test.ts","typecheck":"tsc --noEmit -p tsconfig.json","prepublishOnly":"pnpm build"},"publishConfig":{"access":"public"},"dependencies":{},"devDependencies":{"tsup":"^8.3.0","typescript":"^5.6.3"},"_id":"@aigc-kino/logger-sdk@1.3.6","gitHead":"f6a8366451c40ed35f1c2574fc4ce3758a4375b4","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-919Km3rlcU9O6Ygm3kBQjApbxWGcQH50PPOZcBP0DzyXSrUaa3waGKSIrBF3+M3eLQnGGQDraYMJRmmmCrWF1A==","shasum":"c7bb46b2136cd2288a0f8719057f9aad90ea9443","tarball":"https://registry.npmjs.org/@aigc-kino/logger-sdk/-/logger-sdk-1.3.6.tgz","fileCount":7,"unpackedSize":140453,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDpiY2Ymt4M7ILI58PqJOLApL8/i7jPKzsO/f1CpLdUhQIgQzqCS3FA0kauAbYj/3bkIcQe29KkuwwkbHrf0ZtKMSk="}]},"_npmUser":{"name":"jwzx","email":"15850507505@163.com"},"directories":{},"maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/logger-sdk_1.3.6_1788492016323_0.7997311410158958"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-18T10:41:13.809Z","modified":"2026-09-04T03:20:16.640Z","1.3.0":"2026-08-18T10:41:14.222Z","1.3.1":"2026-08-26T05:07:57.336Z","1.3.2":"2026-08-31T09:24:01.443Z","1.3.3":"2026-08-31T10:04:25.670Z","1.3.4":"2026-08-31T10:43:15.109Z","1.3.5":"2026-09-02T12:59:20.657Z","1.3.6":"2026-09-04T03:20:16.466Z"},"license":"MIT","homepage":"https://vkino.cn","description":"前端日志采集 SDK（浏览器端），支持 JS / Vue / 网络 / 性能 / 行为 / 业务日志上报，可对接 Log-collection-platform 日志网关。","maintainers":[{"name":"jwzx","email":"15850507505@163.com"}],"readme":"﻿# Logger SDK 使用文档\n\n> `@aigc-kino/logger-sdk` — 前端日志采集 SDK（TypeScript）\n>\n> 支持异常监控、性能监控、网络监控、用户行为、业务日志、qiankun 微前端。\n\n## 版本说明\n\n`1.3.6` 修复 Fetch 流式响应兼容性：\n\n- 默认不读取 SSE、`multipart`、二进制和未知 Content-Type 的响应正文，仍记录 URL、方法、状态码、首包耗时与成功状态。\n- 正文采集仅允许明确的文本或 JSON 类型，并在后台最多读取 10KB；业务 `fetch` 在响应头到达后立即返回，不等待日志采集完成。\n- 可通过 `skipResponseBodyTypes` 扩展跳过列表；`ignoreUrls` 仍用于完全跳过网络记录。\n\n`1.3.5` 修复离线恢复与过载重试：\n\n- IndexedDB 离线日志恢复后仅在服务端确认接收时删除，避免网络失败或进程中断造成已缓存日志丢失。\n- 对 HTTP `429`、`5xx` 和网络失败采用指数退避；服务端提供 `Retry-After` 时优先遵守其恢复时间。\n- 离线缓存同时受 2,000 条和 5 MiB 限制，超限时优先淘汰最早日志。\n\n`1.3.4` 新增以下采集能力：\n\n- 每条日志的 `extra.browserDetail` 自动记录浏览器和操作系统版本、设备类型、语言、屏幕分辨率与时区；不采集完整 User-Agent。\n- Fetch、XMLHttpRequest 和 Axios 在 HTTP 状态码不等于 `200` 且响应体可读取时，将响应文本写入网络日志的 `extra.responseBody`，最大保留 10KB。二进制、跨域不可读或读取失败的响应会跳过该字段，不影响原请求。\n- 对于 HTTP 始终返回 `200`、但使用 JSON `code` 表示业务结果的服务，可在 `init` 中配置 `businessSuccessCodes`。例如 `{ businessSuccessCodes: [200] }` 会采集 `code: 500` 的响应体。\n\n## 1. 安装\n\n```bash\npnpm add @aigc-kino/logger-sdk\n# 或\nnpm install @aigc-kino/logger-sdk\n```\n\nCDN 方式：\n\n```html\n<!-- 建议锁定版本并启用 SRI 完整性校验，防止 CDN 被篡改 -->\n<script\n  src=\"https://cdn.example.com/logger-sdk/1.0.0/index.umd.js\"\n  integrity=\"sha384-<构建时生成的哈希>\"\n  crossorigin=\"anonymous\"\n></script>\n<script>\n  LoggerSDK.init({ projectId: 'kino-log-platfrom', token: 'YOUR_TOKEN' })\n</script>\n```\n\n## 2. 快速开始\n\n在应用入口尽早初始化（建议在所有业务代码之前）：\n\n```ts\nimport { init } from '@aigc-kino/logger-sdk'\n\ninit({\n  projectId: 'kino-log-platfrom',       // 必填：项目 ID（Admin 后台创建）\n  token: 'YOUR_TOKEN',            // 必填：上报 Token\n  serverUrl: 'https://log.example.com/vkino-monitor', // 必填：包含项目公开前缀的网关地址\n  env: 'production',              // 环境：development / test / production\n  version: '2.1.0',               // 应用版本，需与 SourceMap 上传版本一致\n})\n```\n\n初始化后 SDK 自动采集：JS 错误、Promise 错误、资源错误、fetch 请求、性能指标、PV。\n\n## 3. 完整配置项\n\n```ts\ninit({\n  // ---- 基础（必填） ----\n  projectId: 'kino-log-platfrom',\n  token: 'YOUR_TOKEN',\n  serverUrl: 'https://log.example.com/vkino-monitor',\n\n  // ---- 基础（可选） ----\n  env: 'production',\n  version: '2.1.0',\n  userId: '10001',              // 也可稍后通过 setUser 设置\n\n  // ---- 采集开关 ----\n  enableError: true,            // JS/Promise/资源错误\n  enablePerformance: true,      // LCP、FCP 等性能指标\n  enableBehavior: true,         // 点击、路由等用户行为\n  enableNetwork: true,          // fetch/axios 请求\n  enableConsole: false,         // console.error/warn 采集\n\n  // ---- 上报策略 ----\n  sampleRate: 1,                // 采样率 0~1\n  batchSize: 50,                // 批量上报条数阈值\n  uploadInterval: 5000,         // 上报间隔（ms）\n  maxRetry: 3,                  // 失败重试次数\n  ignoreErrors: [               // 忽略的错误（字符串或正则）\n    'ResizeObserver loop',\n    /Script error/,\n  ],\n  ignoreUrls: [/\\/api\\/heartbeat/], // 忽略采集的请求 URL\n  // 仍记录状态码、首包耗时等元数据，但不读取正文，避免 SSE/流式响应阻塞业务 fetch\n  skipResponseBodyTypes: ['text/event-stream', 'multipart/', 'application/octet-stream'],\n\n  // ---- 钩子 ----\n  beforeSend(log) {             // 上报前拦截/加工，返回 false 丢弃\n    if (log.message?.includes('password')) return false\n    // 页面地址脱敏：仅掩码敏感 query 参数，保留非敏感 query 与 hash（推荐，避免页面地址不完整）\n    log.url = scrubUrl(log.url)\n    return log\n  },\n})\n```\n\n> 说明：`sampleRate`、`ignoreErrors`、`uploadInterval`、`batchSize` 等支持在 Admin 后台「SDK 配置中心」动态下发，远端配置优先级高于本地。\n\n## 4. 框架接入\n\n### 4.1 Vue3\n\n```ts\nimport { createApp } from 'vue'\nimport { init, VuePlugin } from '@aigc-kino/logger-sdk'\nimport App from './App.vue'\n\ninit({ projectId: 'kino-log-platfrom', token: 'YOUR_TOKEN', serverUrl: 'https://log.example.com' })\n\nconst app = createApp(App)\napp.use(VuePlugin)   // 采集 Vue 组件错误（含组件名、props 摘要）\napp.mount('#app')\n```\n\n> 路由 PV 已由内置页面插件自动采集：SDK 劫持 `history.pushState`/`replaceState`/`popstate`/`hashchange`，在 SPA 路由变更时自动上报 `type=page` 的 PV 日志，**无需也不存在 `RouterPlugin`**。若需在主日志中附带当前路由字段，设置 `microFrontend: { hostApp }` 即可（见第 6 节）。\n\n### 4.2 Axios\n\n```ts\nimport axios from 'axios'\nimport { attachAxios } from '@aigc-kino/logger-sdk'\n\nattachAxios(axios)   // 采集请求 URL、状态码、耗时；非 200 时尽量采集响应体\n```\n\n## 5. API\n\n### 5.1 用户与会话\n\n```ts\nimport { clearUser, clearUserToken, setUser, setUserToken, setTag, getSessionId, getTraceId } from '@aigc-kino/logger-sdk'\n\nsetUser('10001')                     // 兼容旧用法：只设置用户 ID\nsetUser('10001', {\n  nickname: 'Alice',\n  email: 'alice@example.com',\n  phone: '13800000000',\n  avatar: 'https://example.com/avatar.png',\n  custom: { plan: 'pro', region: 'cn-east' },\n})\nclearUser()                          // 退出登录时解除后续日志的用户关联\nsetUserToken('CURRENT_USER_ACCESS_TOKEN') // 当前用户访问 token，只随上报批次发送\nclearUserToken()                     // 退出登录或换号时清除访问 token\nsetTag('channel', 'app')             // 附加全局标签（写入 extra）\nconst sessionId = getSessionId()     // 当前会话 ID\nconst traceId = getTraceId()         // 当前 Trace ID\n```\n\n用户资料由固定基础字段 `nickname`、`email`、`phone`、`avatar` 和 `custom` 扩展对象组成。部分更新时，未提供的字段保留服务端旧值；显式传入 `null` 会清除对应字段；非空 `custom` 每次整体替换，不做深层合并，`custom: null` 会清空扩展对象。`clearUser()` 只清除 SDK 当前关联，不删除服务端已保存的资料。\n\n资料上报设置 5 秒超时，失败不会阻塞日志采集。用户访问 token 仅作为批次顶层 `userToken` 发送，不会写入单条日志或 IndexedDB 离线队列；登录、换号或退出后，下一批日志会读取当前值。SDK 仅在初始化配置启用 `debug` 时输出诊断信息，诊断信息不会包含项目 Token 或用户资料。SDK 不会自动采集姓名、邮箱、手机号等个人信息；接入方必须在取得合法授权并满足适用隐私与合规要求后，才可显式传入这些字段。\n\n### 5.2 业务日志\n\n```ts\nimport { track } from '@aigc-kino/logger-sdk'\n\ntrack('order-paid', {                // type=business\n  orderId: 'O20260731001',\n  amount: 99,\n})\n```\n\n### 5.3 手动上报\n\n```ts\nimport { captureError, captureMessage } from '@aigc-kino/logger-sdk'\n\ntry {\n  riskyOperation()\n} catch (e) {\n  captureError(e, { scene: 'checkout' })   // type=js-error，extra 附加上下文\n}\n\ncaptureMessage('库存同步延迟', 'warn')       // type=custom\n```\n\n### 5.4 立即上报与销毁\n\n```ts\nimport { flush, destroy } from '@aigc-kino/logger-sdk'\n\nawait flush()   // 立即上报缓存中全部日志\ndestroy()       // 移除全部监听器并清理（SPA 子应用卸载时调用）\n```\n\n### 5.5 页面地址脱敏\n\n```ts\nimport { scrubUrl } from '@aigc-kino/logger-sdk'\n\n// 仅掩码敏感 query 参数（token/password/phone 等）的值，保留非敏感 query 与 hash\nscrubUrl('https://a.com/detail?id=1&token=xx#/edit?tab=2')\n// => 'https://a.com/detail?id=1&token=***#/edit?tab=2'\n```\n\n> 脱敏请在 `beforeSend` 中使用 `scrubUrl`，**不要**直接 `url.search = ''` 全量剥离 query/hash，否则日志中的页面地址会丢失路由参数、无法定位页面。\n\n## 6. qiankun 微前端接入\n\n主应用：\n\n```ts\ninit({\n  projectId: 'portal',\n  token: 'PORTAL_TOKEN',\n  serverUrl: 'https://log.example.com',\n  microFrontend: { hostApp: 'portal' },\n})\n```\n\n子应用：\n\n```ts\ninit({\n  projectId: 'editor',\n  token: 'EDITOR_TOKEN',\n  serverUrl: 'https://log.example.com',\n  microFrontend: {\n    hostApp: 'portal',\n    microApp: 'editor',\n    container: '#subapp',\n  },\n})\n```\n\n- 日志自动附加 `hostApp`、`microApp`、`route`、`container` 字段；\n- 主/子应用共享 `traceId`，可在 Admin 中跨应用关联查询；\n- 子应用卸载生命周期中调用 `destroy()` 防止内存泄漏。\n\n## 7. SourceMap 上传（配合错误定位）\n\n构建后将 `.map` 文件上传到平台（勿部署到线上 CDN）：\n\n```bash\ncurl -X POST https://log.example.com/api/sourcemap/upload \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -F \"project=kino-log-platfrom\" \\\n  -F \"version=2.1.0\" \\\n  -F \"file=@dist/assets/main.63df3.js.map\"\n```\n\n> `version` 必须与 `init({ version })` 一致，否则堆栈无法解析到源码。\n\n上传后异常中心展示效果：\n\n```text\n原始： main.63df3.js:10982:12\n解析： src/views/Home.vue  line 132  column 18（支持源码预览）\n```\n\n## 8. 上报机制说明\n\n```text\n采集 → 标准化 → IndexedDB 缓存 → 批量上报（fetch keepalive）\n                                    ↓ 失败\n                                  重试（maxRetry）\n页面卸载 → sendBeacon 兜底上报\n```\n\n- 达到 `batchSize` 或到达 `uploadInterval` 即触发一次批量上报；\n- 断网/失败日志持久化在 IndexedDB，恢复后自动补报，不重复；\n- SDK 自身上报请求不会被网络采集（防循环）。\n\n## 9. 日志字段参考\n\n| 字段 | 说明 | 来源 |\n|------|------|------|\n| projectId / env / version | 项目标识 | init 配置 |\n| type / level / message / stack | 日志内容 | 自动采集或手动 API |\n| url | 页面地址 | 自动 |\n| userId | 用户 ID | setUser |\n| sessionId / traceId | 会话 / 链路 | 自动生成 |\n| browser / device / network | 简略环境信息 | 自动解析 |\n| extra.browserDetail | 浏览器/系统版本、设备、语言、分辨率、时区 | 自动解析，不含完整 User-Agent |\n| extra.responseBody | 非 200 网络请求的可读取响应文本，最大 10KB | Fetch / XHR / Axios |\n| businessSuccessCodes | HTTP 200 时用于识别业务成功的响应 `code`；业务码不匹配时采集响应体 | init 可选配置 |\n| skipResponseBodyTypes | 不读取响应正文的 Content-Type；默认跳过 SSE、multipart、二进制和未知类型，仍保留网络元数据 | init 可选配置 |\n| timestamp | 毫秒时间戳 | 自动 |\n| extra | 扩展字段 | setTag / track / capture* |\n\n## 10. 常见问题（FAQ）\n\n**Q：日志没有上报？**\n依次检查：`projectId`/`token` 是否正确 → 网关地址可达 → 是否被 `sampleRate`/`ignoreErrors` 过滤 → Network 面板中 `/api/log/upload` 响应是否为 `{\"success\":true}`。\n\n**Q：Script error 无堆栈？**\n跨域脚本需在 `<script>` 上加 `crossorigin=\"anonymous\"`，且 CDN 响应头包含 `Access-Control-Allow-Origin`。\n\n**Q：错误堆栈未解析为源码？**\n确认对应 `version` 的 sourcemap 已上传，且构建产物 hash 与 map 文件匹配。\n\n**Q：如何临时关闭采集？**\nAdmin 后台将该项目 `sampleRate` 设为 0，SDK 拉取配置后即停止上报，无需发版。\n","readmeFilename":"README.md"}