前端接口请求统一日志记录与审计需拦截所有请求,通过重写fetch/xmlhttprequest或利用axios拦截器收集url、方法、参数、状态、耗时等字段,脱敏敏感信息,按采样策略用sendbeacon/fetch上报,并关联监控与用户行为。

在前端实现接口请求的统一日志记录与审计,核心是拦截所有请求发起点,自动收集关键字段(如 URL、方法、参数、响应状态、耗时、错误信息等),并按需上报到日志服务或本地存储。不依赖第三方 SDK 也能轻量实现,关键是利用 fetch 和 XMLHttpRequest 的可代理性,以及现代框架的请求封装习惯。
统一拦截请求:重写 fetch 与 XMLHttpRequest
这是最底层、最通用的方式,适用于无框架或混合技术栈项目:
-
重写 fetch:用
window.fetch = new Proxy(originalFetch, {...})包裹原始方法,在then和catch中捕获响应和异常,记录耗时、状态码、请求体(注意避免记录敏感字段)、响应体大小等 -
劫持 XMLHttpRequest:重写
XMLHttpRequest.prototype.open和send,并在onload/onerror中收集结果;需注意监听事件绑定时机(如多次addEventListener需去重) - 注意:重写前保存原方法,避免循环调用;生产环境建议加开关控制是否启用日志,避免性能损耗
基于请求库封装(如 axios)做拦截器
若项目使用 axios、umi-request 等主流请求库,优先用其内置拦截机制,更稳定、易维护:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 请求拦截器中记录:时间戳、URL、method、headers(脱敏后)、data/query(可选摘要,如 JSON.stringify 后截断前 200 字符)
- 在 响应拦截器中补充:HTTP 状态码、响应耗时(
Date.now() - startTimestamp)、响应大小(response.headers.get('content-length'))、业务 code(如response.data.code !== 0视为逻辑异常) - 对失败请求(网络错误 / 4xx / 5xx / 业务异常)额外标记
isError: true,便于审计筛选
日志结构设计与安全脱敏
日志不是越全越好,需兼顾可查性与合规性(如 GDPR、等保要求):
- 必记字段:
timestamp、url、method、durationMs、status(HTTP 状态)、statusCode(业务码)、traceId(如有全链路追踪)、env(prod/staging) - 敏感字段必须脱敏:
Authorization、Cookie、手机号、身份证、token、密码类参数 —— 建议用正则全局替换或白名单 key 过滤(如只保留{ "id": 123 },过滤"token"、"phone") - 大字段限制长度:请求/响应 body 超过 1KB 可截断并标记
bodyTruncated: true,避免日志膨胀
日志上报策略与可靠性保障
前端日志易丢失,需兼顾及时性与送达率:
- 非关键日志可用
sendBeacon上报:页面卸载前可靠发送(兼容性好,不阻塞卸载) - 普通日志用
fetch(..., { keepalive: true }):适合后台静默上报,支持跨域 - 失败日志可暂存
localStorage,下次打开页面时补传(注意容量限制和过期清理) - 采样控制:高流量场景下,对成功请求按 1% 采样,错误请求 100% 上报,减少日志服务压力
不复杂但容易忽略:日志要真正有用,得和监控告警、用户行为、错误堆栈打通。比如某接口连续 5 分钟错误率超 10%,就该触发前端侧告警;再比如把日志中的 userId 或 sessionId 关联到具体用户操作流,审计时才能还原问题现场。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










