可使用 proxy 拦截 get/set 实现无侵入日志:记录属性读写、嵌套代理、过滤内部字段(如_开头、symbol、原型访问),函数属性自动包装以统计调用与耗时,封装为支持配置与动态启停的日志代理工厂。

可以使用 JavaScript 的 Proxy 拦截对象的读写操作,在不修改原始对象逻辑的前提下,自动注入日志行为。
拦截 get 和 set 操作记录访问与修改
通过 get 和 set 陷阱,能在每次属性读取或赋值时打印日志。注意保留原始行为(如返回原值、触发 setter),否则对象将无法正常工作。
- 在
get中记录属性名和返回值,再返回原值 - 在
set中记录属性名、新值和旧值(需先读取),再执行赋值 - 对嵌套对象递归代理可增强日志覆盖范围,但需避免循环代理
区分内部操作与用户操作避免日志污染
某些框架或库会频繁读写内部属性(如 __proto__、constructor 或以 _ 开头的私有字段),直接记录会导致日志爆炸。可在代理中加条件过滤:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 跳过 Symbol 属性和原型链访问(如
target === receiver不成立时) - 忽略以
_开头或已知内部字段名(如__v_isRef) - 用
Reflect.get/Reflect.set保证默认行为,而非直接访问target[key]
支持方法调用日志与执行耗时统计
若对象含函数属性,可在 get 中对函数做一层包装,实现调用日志和性能追踪:
- 检测返回值是否为函数,是则返回包装后的函数
- 包装函数内记录入参、开始时间、执行结果或错误、耗时
- 保持
this绑定正确(用apply并传入原对象)
封装成可复用的日志代理工厂
把上述逻辑收拢为一个函数,便于在不同对象上快速启用日志:
- 接受目标对象和可选配置(如是否记录方法、是否忽略私有字段)
- 返回代理对象,同时提供
disable()方法临时关闭日志(通过闭包开关变量) - 支持多级嵌套代理,但需缓存已代理对象,防止重复代理同一对象










