微信小程序中日志监控系统实践

309 阅读2分钟

什么是日志监控

日志监控是软件开发和运维领域中常用的技术手段,用于收集、分析和监控系统运行时的信息。

  1. 日志监控(Logging):

    • 定义: 日志是系统在运行时生成的记录,其中包含有关应用程序状态、错误、警告等信息的文本。日志监控是一种通过收集、存储和分析日志数据来监视系统运行状态的实践。
    • 用途: 日志监控用于实时检测系统中的问题、故障或异常。通过分析日志,开发人员和运维团队可以快速定位并解决问题,提高系统的可用性和稳定性。
    • 工具: 有许多日志监控工具,如ELK Stack(Elasticsearch、Logstash、Kibana)、Splunk、Graylog等,它们能够集中管理、搜索和可视化大量的日志数据。

微信小程序中实现日志监控

这里示例中只列举了监控request方法, 实际项目中我们还需要代理uploadFile等微信请求api,监听onError、onUnhandledRejection等捕获的js错误

因为微信小程序不支持使用proxy 方式, 所以我们使用Object.defineProperty来代替

流程图

graph TD
全局维护一个日志信息的队列 --> 代理wx.request方法 --> value描述符中配置相应的操作并收集该请求的日志信息包含请求体和响应体 --> value描述符中返回执行包装后的wx.request  --> 特定时期执行上传日志的接口并消费日志队列

伪示例

// 收集的日志数据队列
const queue = []
const originRequest = wx.request

// 代理wx.request 方法
Object.defineProperty(wx, 'request', {
  configurable: true,
  enumerable: true,
  writable: true,
  value(config) {
    const originSuccess = config.success
    const originFail = config.fail
    // 收集请求的对象, 具体待实现
    const requestContext = {}
    // 收集响应的方法
    const temp = funcation(res) {
      // 具体逻辑具体处理, 一般需要收集响应状态码,请求耗时, 截断后的部分响应结果
      queue.push({ requestContext })
    }
    config.success = funcation(res) {
      temp(res)
      originSuccess(res)
    }
    config.fail = funcation(error) {
      temp(res)
      originFail(error)
    }
    return wx.request(config)
  }
})


// 特定时间执行发送日志请求, 将queue 日志队列消费掉
originRequest.call(wx, {
  method: 'POST',
  url: '',
  data: queue,
  success() {
    queue = [] // 清空已经上传了的日志队列
  },
  fail() {
  }
})

待优化点

  1. 在页面空闲时调用上传日志接口(微信小程序中暂无这种api, 可以用setTimeout 延时一下)
  2. 优化日志遗漏的问题。(用户退出, 将日志存储起来,下一次启动时再调用)
  3. 存储的日志较大,将不重要的接口信息进行截断操作
  4. 提供需要过滤的接口, 防止干扰数据(例如: 埋点的接口url, 通常埋点的url 我们不需要算到日志中)