如何通过重写简写方法实现无侵入的前端异步埋点日志注入

浅敏君_6676

浅敏君_6676

2026-06-01

324人浏览

原创

核心思路是通过重写fetch、xmlhttprequest和promise.prototype.then/catch等原生api实现无侵入埋点:自动注入上下文字段、统一捕获请求与逻辑流状态,并经bury.log()防抖批量上报。

如何通过重写简写方法实现无侵入的前端异步埋点日志注入

核心思路是利用 JavaScript 原生异步 API(如 fetch、XMLHttpRequest、setTimeout、Promise.then 等)的底层调用链,在不修改业务代码的前提下,自动捕获关键行为并注入日志上下文。

重写 fetch 实现请求级无侵入埋点

拦截所有 fetch 调用,在发起前自动附加埋点字段(如页面 URL、用户 ID、时间戳、请求路径),并在响应后记录成功/失败状态。无需在每个 fetch 调用处加日志代码。

  • 保存原生 fetch 引用,避免递归调用
  • 包装参数:从 url 和 options 中提取 method、headers,并注入 __trace_id、__page 等字段
  • 使用 Promise.finally 统一上报结果,不干扰原有逻辑流
  • 错误时携带 statusText 和 status,便于归因网络或服务端问题

劫持 XMLHttpRequest 实现兼容性兜底

对老项目或需支持 IE 的场景,重写 XMLHttpRequest.prototype.open 和 .send,同样注入上下文并监听 onload/onerror。

PigX UI 前端开发
PigX UI 前端开发

PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。

下载
  • 在 open 阶段记录请求起始信息(URL、method)
  • 在 send 前挂载自定义 header,如 X-BP-Page、X-BP-User
  • 通过 addEventListener('loadend') 统一收集耗时与状态,避免重复绑定
  • 注意区分主动 abort 与真实失败,避免误报

封装 Promise.then/catch 实现逻辑流埋点

不直接重写 Promise 构造器(风险高),而是 monkey patch Promise.prototype.then 和 .catch,在链式调用中自动附加可追踪标识。

  • 为每个 then 回调包裹一层 try-catch,捕获未处理的 Promise rejection
  • 将当前调用栈简略信息(如上层函数名、触发事件类型)注入日志 payload
  • 结合 performance.now() 计算各环节耗时,辅助性能分析
  • 仅对非空回调生效,避免污染基础库内部 Promise 使用

统一日志出口与防抖批量上报

所有重写入口最终都汇聚到一个轻量 Bury.log() 方法,它不立即发请求,而是缓存 + 定时 flush。

  • 内存中暂存日志项,按 type(request / error / custom)分类
  • 每 2 秒或累计达 10 条时,调用 navigator.sendBeacon 批量发送
  • 页面卸载前强制 flush,确保关键日志不丢失
  • 失败日志降级为 localStorage 持久化,下次启动时补传

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2363

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5103

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6170

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5698

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

803

5

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4666

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1169

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4604

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

920

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程