生产环境下能否查看Ionic应用的info级别运行日志?
Ionic生产环境info级日志采集方案
方案1:自研轻量日志上报组件
- 封装统一的日志打印方法,替代原生
console.log,新增日志分级控制,生产环境默认只保留info及以上级别的日志 - 代码示例:
// 自定义日志工具类 class Logger { static info(tag: string, message: string, data?: any) { // 生产环境开启上报,开发环境正常打印 if (import.meta.env.PROD) { // 构造日志上报参数 const logData = { level: 'info', tag, message, data: data ? JSON.stringify(data) : '', timestamp: Date.now(), userId: localStorage.getItem('userId') || 'anonymous', appVersion: '你的应用版本号' } // 批量上报逻辑,避免频繁请求,比如攒满10条或者每30秒上报一次 this.addLogQueue(logData) } else { console.log(`[INFO][${tag}] ${message}`, data || '') } } private static logQueue: any[] = [] private static addLogQueue(log: any) { this.logQueue.push(log) if (this.logQueue.length >= 10) { this.flushQueue() } // 定时上报兜底 if (!this.timer) { this.timer = setInterval(() => { if (this.logQueue.length > 0) this.flushQueue() }, 30000) } } private static flushQueue() { // 调用你的后端日志接收接口上报 const logs = [...this.logQueue] this.logQueue = [] fetch('/api/log/report', { method: 'POST', body: JSON.stringify(logs), headers: { 'Content-Type': 'application/json' }, keepalive: true // 页面关闭时也能完成上报 }).catch(() => { // 上报失败回塞队列,下次重试 this.logQueue.unshift(...logs) }) } private static timer: any = null }
- 后端收到日志后可以存入ES或者其他日志检索系统,按用户、版本、时间筛选查询即可。
方案2:复用现有APM工具的自定义事件能力
- 你已经在用的Sentry本身就支持自定义info级事件上报,不需要额外接入其他工具:
- 调用Sentry的
captureMessage方法,指定级别为info即可 - 代码示例:
import * as Sentry from '@sentry/angular'; Sentry.captureMessage('用户进入商品详情页', 'info', { extra: { goodsId: '12345', source: '首页推荐' } });- 在Sentry后台可以按事件级别筛选,单独查看所有info级别的普通日志
- 调用Sentry的
- 如果已经接入其他移动端APM工具,绝大多数都支持自定义埋点/自定义事件上报,直接把info日志作为自定义事件上报即可,不需要额外开发全链路日志体系。
方案3:端侧本地缓存+按需拉取
- 对用户隐私要求高、不能随意上报日志的场景,可以把info日志加密存在用户本地存储(比如Ionic的
@capacitor/storage或者SQLite) - 当用户反馈问题时,在应用内加一个日志导出入口,用户授权后把本地日志打包导出,或者在用户同意的情况下上传到后台供排查问题使用
- 注意控制本地日志的存储上限,定期清理7天以上的旧日志,避免占用用户过多存储空间。
内容的提问来源于stack exchange,提问作者Eden Oiknine
相关产品推荐
相关产品推荐

