生产环境异步异常日志需统一捕获unhandledrejection、封装safeawait结构化上报、透传traceid串联链路,并脱敏敏感信息、分级记录、确保可检索。

在生产环境中记录异步操作的异常日志,核心是捕获所有可能逃逸的 Promise 拒绝(unhandled rejection)并统一上报,同时保留上下文、堆栈和业务标识。不依赖 try/catch 处处包裹,也不让错误静默丢失。
监听全局未处理的 Promise 拒绝
这是兜底防线,能捕获所有漏掉 .catch() 或 await 后未被 try/catch 包裹的 Promise 错误:
- 使用
window.addEventListener('unhandledrejection')(浏览器)或process.on('unhandledRejection')(Node.js) - 在事件回调中提取
reason(错误对象)、promise(触发拒绝的 Promise 实例)和可选的url/context - 避免直接
console.error,而是调用统一日志上报函数,带上level: 'error'和source: 'unhandled-rejection'
封装 await 调用,自动捕获并结构化日志
对高频异步操作(如 API 请求、定时任务),用工具函数替代裸 await,减少重复错误处理逻辑:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 写一个
safeAwait(promise, options):接收 Promise 和配置(如opName、tags、extra) - 内部用
try/catch,捕获后构造结构化日志对象,包含时间戳、操作名、URL(如有)、请求参数(脱敏后)、响应状态(如有)、堆栈(error.stack) - 返回
[data, error]元组,业务层按需判断,不中断正常流程
为关键异步链路打唯一 traceId,串联前后端日志
单次用户行为(如点击提交)触发的多个异步请求,应共享同一个 trace 标识,便于问题定位:
- 在发起源头(如按钮点击)生成短随机 ID(如
crypto.randomUUID().slice(0,8))或使用现有请求 ID - 将该
traceId透传到每个异步调用(作为请求 header、函数参数或上下文对象) - 日志上报时统一携带
traceId字段,后端日志系统可据此聚合前端异步错误与对应接口日志
日志内容要脱敏、分级、可检索
生产日志不是越全越好,而是要兼顾安全、可读与排查效率:
-
敏感字段(token、手机号、身份证号、完整 request body)必须过滤或掩码处理,例如用
***替换中间 4 位手机号 - 区分日志等级:
warn(预期外但可恢复,如接口限流)、error(阻断流程,如登录态失效)、fatal(JS 崩溃级,如 unhandledrejection + 页面白屏) - 每条日志至少含:
timestamp、level、message、traceId、opName、stack(非空时)、env: 'prod'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










