小程序上线后,真正能帮我们定位问题、优化体验的,往往不是用户反馈,而是运行日志。日志分析不是把日志存下来就完事,而是建立一条从采集、存储、检索到告警的完整链路。这篇文章按这条链路拆解,给出可直接落地的方法。

日志该记什么
小程序日志大致分三类,采集策略各不相同:
- 运行时错误:JS 异常、Promise 未捕获拒绝、页面渲染失败。这类日志必须带堆栈和页面路径。
- 性能指标:启动耗时、页面切换耗时、接口响应时间、setData 数据量与耗时。
- 业务行为:关键按钮点击、支付流程节点、分享与登录结果。用于还原用户操作路径。
不要什么都记。日志量一旦失控,存储成本和检索噪音都会反噬。原则是:能回答“哪个页面、哪个用户、发生了什么、耗时多少”即可。
采集端:统一封装上报
在 app.js 里挂一个轻量上报器,统一处理缓冲、批量、失败重试,避免每个页面各写一套。
const queue = [];
let timer = null;
function flush() {
if (!queue.length) return;
const batch = queue.splice(0, 20);
wx.request({
url: 'https://api.example.com/log',
method: 'POST',
data: { logs: batch },
fail: () => queue.unshift(...batch) // 失败回填,下次重试
});
}
function report(type, payload) {
queue.push({
type,
ts: Date.now(),
page: getCurrentPages().pop()?.route,
...payload
});
if (!timer) timer = setTimeout(() => { flush(); timer = null; }, 3000);
}
// 全局异常捕获
App({
onError(err) { report('js_error', { msg: err }); },
onUnhandledRejection(res) { report('promise_error', { msg: res.reason }); }
});几个细节值得注意:批量上报减少请求数;失败回填防止日志丢失;getCurrentPages().pop() 取当前路由,便于按页面聚合。上报接口本身要加超时和静默失败,绝不能因为日志拖慢主流程。
存储与检索:结构化优先
日志落到服务端后,尽量以结构化字段存储,而不是一整段文本。推荐字段:type、page、ts、openid(脱敏)、duration、error_msg。用云开发时,可以直接写入集合并建索引;自建服务则写入日志库或对象存储后做离线解析。
检索维度建议固定为三组:按时间范围、按页面、按错误类型。多数问题靠“某页面近一小时错误数突增”就能锁定。
性能日志:找到真正的瓶颈
性能类日志要成对记录开始与结束,计算差值后上报,而不是只记一个时间戳。
function trackPageLoad(pageName) {
const start = Date.now();
return () => {
const cost = Date.now() - start;
report('perf', { page: pageName, duration: cost });
if (cost > 2000) report('perf_slow', { page: pageName, duration: cost });
};
}
// 页面中使用
Page({
onLoad() { this.done = trackPageLoad('home'); },
onReady() { this.done(); }
});同时记录 setData 的数据体积。很多卡顿不是接口慢,而是一次性 setData 了几百 KB 的列表数据。把体积和耗时一起上报,优化方向会清晰很多。
从日志到告警
日志分析的价值在闭环。建议设置三条基础规则:
- 某页面 5 分钟内错误数超过阈值,推送告警;
- 启动耗时 P90 超过设定值,记录并通知;
- 支付流程中某节点失败率异常升高,立即告警。
告警要带上下文:页面路径、错误摘要、影响用户数。否则收到通知还得再查一遍,响应速度会大打折扣。
数据脱敏与合规
日志里不要出现手机号、身份证、完整 openid 等敏感信息。openid 可做哈希后存储,仅用于去重和关联。上报前统一过滤字段,比事后清理可靠得多。
日志分析的目标不是收集更多数据,而是让每一次线上异常都能被快速定位,让每一次性能优化都有数据支撑。
把采集、存储、检索、告警四步串起来,日志才真正成为决策依据。对独立开发者而言,这套机制搭一次,后续每个项目都能复用,投入产出比很高。

评论 (0)
还没有评论,快来抢沙发吧~