OSS JS SDK浏览器端如何收集用户日志

本文涉及的产品
对象存储 OSS,20GB 3个月
阿里云盘企业版 CDE,企业版用户数5人 500GB空间
云备份 Cloud Backup,100GB 3个月
简介:

背景

客户使用我们的oss js sdk开发应用产品时,一旦产品面向广大用户,由于产品运行在不同的终端,用户的操作千差万异,用户一旦在前端遇到问题时,反馈给客户,客户由于没有相关日志信息只能靠猜测,而且很难模拟用户当时的操作环境,问题也很难定位,站在客户角度很希望有一套东西能够协助解决这种场景。对于SDK提供方来说,我们坚决不收集用户信息,这是我们的责任。但是客户希望用户操作发生异常的时候,能够把相关信息进行收集,方便问题定位和重现。事实上我们提供的调试信息也是客户需求的。因此我们提供方案,把调试信息的接口报漏出来。至于如何收集这些信息,如何上传这些信息,这些都是客户需要做的东西,我们可以提供参考代码,客户根据自己的场景自由选择,自己收集自己上传,至于上传到哪里,哪个日志平台还是客户自己的日志分析平台,他们自主选择。这样无疑会给客户提供一定帮助。

解决方案

在js sdk原来的调试信息里面把调试信息加入级别备注,比如warning 、error、success等,然后挂载到我们js sdk暴露出的对象原型上,业务方(也就是我们的客户)在业务代码中劫持debug函数信息,如何劫持看下文,然再结合第三方日志收集工具比如logline把日志收集到localstoreage 、indexed db 、或者websql中,客户可以根据logline提供的功能,可以选择存储日志的方式、记录日志、读取日志、清除日志等,关于如何上传日志,只需要通过获取日志后,业务方自己写逻辑就可以了,当然建议使用阿里云的STS服务,更加强大、稳定、可靠。

JS SDK改动

在js sdk把debug函数暴露到实例原型上,同时debug函数里面把调试信息加入级别备注,比如warning 、error、success等,目前已经代码提交到6.X系列版本。

客户改动

  • ali-oss的版本必须是6.X系列版本。
  • 开发者在业务代码里劫持debug函数,重写,获取里面的debug信息,然后可以配合第三方日志工具进行本地存储,比如logine,具体文档可移步:https://github.com/latel/logline

示例

下面是基于ali-oss 6.x版本,告诉用户如何收集日志,可控制存储什么级别的日志,如何获取日志为例进行演示,用户获取日志后可自行撰写上传逻辑。注意:js sdk源码中debug函数最后一个参数是控制日志的级别的目前就三个info、waring 、error三种。

1. 开发环境中使用6.X系列版本

劫持debug信息

同时调用logine并选择一种方式存储日志信息。示例代码如下。

/ 引入ali-oss 6.X 
const OSS = require('ali-oss');
// 日志收集引入第三方日志收集工具logline
const Logline = require('logline');
// 选择日志协议,web端主要有三种存储方式:websql、indexeddb、localstorage
Logline.using(Logline.PROTOCOL.LOCALSTORAGE)
const sdkLog = new Logline('sdk');
// 劫持OSS.prototype.debug上的日志
const _debug = OSS.prototype.debug;
OSS.prototype.debug = (...params) => {
    console.log(...params);
    // 获取params最后一个参数的数值是info还是error,如果是info就调用sdkLog.info error的话就调用 sdkLog.error
    const info = params[params.length - 1];
    // 解析params参数 ["request %s %s, with headers %j, !!stream: %s", "GET", "http://luozhang002.oss-cn-zhangjiakou.aliyuncs.com/?max-keys=100", {…}, false, "info"]
    // 规则是 %s 或者%s, 替换 字符, %j 或者%j ,替换为对象, 或者把%j对象单独打印出来
    // 解析逻辑 (开发者也可以自己写,这里先提供简单的解析代码,可供参考)
    // 最终要存储的总的信息 params.length的长度约定的至少为2,为2 直接取第一个,其他的长度需要另外处理
   let resultInfo = '';
   if (params.length === 2) {
     resultInfo = params[0];
   } else {
     let k = 1;
     const firstInfo = params[0].split(' ');
     const newInfo = [];
     for (let j = 0; j < firstInfo.length; j++) {
       if (firstInfo[j] === '%s' || firstInfo[j] === '%s,') {
          newInfo.push(params[k]);
          k++;
       } else if (firstInfo[j] === '%j' || firstInfo[j] === '%j,') {
          newInfo.push(JSON.stringify(params[k]));
          k++;
       }  else {
          newInfo.push(firstInfo[j]);
       }
     }
     resultInfo = newInfo.join(' ');
  } // end else
  if (info === 'info') {
    sdkLog.info('info', resultInfo);
  } else {
    sdkLog.error('error', resultInfo);
  }
  // 之前debug的逻辑还是保留的,localstoreage.debug = 'ali-oss'
  _debug(...params);
};

3. 获取日志信息并上传

collect all logs
Logline.all(function(logs) {
    // process logs here这里可以获取到所有的日志是一个大数组,用户可以自行把数据上传到任何地方OSS、STS或者其他日志分析系统
  console.log(logs)
});
// collet logs within .3 days
Logline.get('.3d', function(logs) {    
    // process logs here
});

4. 收集的日志

image

总结

在浏览器端客户如果想收集日志信息,开发者需要在业务代码中劫持debug函数信息,再结合第三方日志收集工具比如logline把日志收集到localstoreage 、indexed db 、或者websql中,然后再获取日志。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
11天前
|
Web App开发 前端开发 JavaScript
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
2015年,JavaScript之父Brendan Eich再次创业,推出Brave浏览器和加密货币Basic Attention Token(BAT),旨在颠覆传统广告行业。Brave屏蔽广告、保护隐私,加载速度快;BAT则通过奖励机制让用户、内容创作者和广告主三方受益。尽管面临用户习惯和巨头竞争的挑战,Brave已拥有超4000万月活跃用户,成为全球增长最快的隐私浏览器,引领Web3生态发展。
83 22
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
|
2月前
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
122 48
|
2月前
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
在浏览器执行js脚本的两种方式
|
2月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
|
2月前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
60 1
|
2月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
466 9
|
2月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
407 1
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
784 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
419 3

相关产品