求助官方 getRealtimeLogManager 5Kb长度的限制?
发布于 7 年前 作者 heyan 10190 次浏览 来自 官方Issues

RealtimeLogManager.info()

日志内容,可以有任意多个。每次调用的参数的总大小不超过5Kb


现在看到超过5Kb就会显示 UserLog:fail Log Size xxxx Exceed.

我在客户端尝试截断,有时灵有时不灵,有些日志上看到了截断后的信息,有些依然是 UserLog:fail Log Size xxxx Exceed.

1,请求官方在接口上自动截断,尽量显示日志信息;

2,望指教下 5Kb 应该怎么计算才能准确无误?

直接把 console.log 封装了 RealtimeLogManager

if (wx.getRealtimeLogManager) {
  const logger = wx.getRealtimeLogManager()
  let consoleLog=console.log
  function str2ab(str) {
    var buf = new ArrayBuffer(str.length * 2); // 每个字符占用2个字节
    var bufView = new Uint16Array(buf);
    for (var i = 0, strLen = str.length; i < strLen; i++) {
      bufView[i] = str.charCodeAt(i);
    }
    return buf;
  }
  function ab2str(buf) {
    return String.fromCharCode.apply(null, new Uint16Array(buf));
  }
  function wlog(){
      let argumentsX=[...arguments]
      return new Promise(function (success,fail) {
        let params=""
        argumentsX.forEach((val,i)=>{
          let str=JSON.stringify(val);
          if(!str) return;
          params+=str
        })
        let bs=str2ab(params.substr(0,1024*5))
        logger.info(ab2str(bs.slice(0,1024*5)).toString());
        success()
      })
  }
  console.log=function () {
    consoleLog(...arguments)
    wlog(...arguments);
  }
}
4 回复

关注下。日志模块官方正在优化,~

这个API  需要发布了小程序才可以使用么  直接预览我这后台没有任何信息

找了另一种截串,依然不是很灵光,时好时坏的,请大家指点

//app.js
// import log from 'utils/realTimeLog'
 
//ascii 返回长度
function ascLength(codeat){
  let len=1
  if(codeat>0x4000000){
    len=6
  }else if(codeat>0x200000){
    len=5
  }else if(codeat>65536){
    len=4
  }else if(codeat>2048){
    len=3
  }else{
    len=2
  }
  return len
}
//简单计算字节长度
String.getBlength = function (str) {
  for (var i = str.length, n = 0; i--; ) {
    n += ascLength(str.charCodeAt(i));
  }
  return n;
}
//按指定字节截取字符串
String.cutByte = function(str,len,endstr){
  var len = +len
    ,endstr = typeof(endstr) == 'undefined' ? "..." : endstr.toString();
  function n2(a){ var n = a / 2 | 0; return (n > 0 ? n : 1)} //用于二分法查找
  if(!(str+"").length || !len || len<=0){return "";}
  if(this.getBlength(str) <= len){return str;} //整个函数中最耗时的一个判断,欢迎优化
  var lenS = len - this.getBlength(endstr)
    ,_lenS = 0
    , _strl = 0
  while (_strl <= lenS){
    var _lenS1 = n2(lenS -_strl)
    _strl += this.getBlength(str.substr(_lenS,_lenS1))
    _lenS += _lenS1
  }
  return str.substr(0,_lenS-1) + endstr
}
if (wx.getRealtimeLogManager) {
  const logger = wx.getRealtimeLogManager()
  let consoleLog=console.log
  function wlog(){
    let argumentsX=[...arguments]
    return new Promise(function (success,fail) {
      let params=""
      argumentsX.forEach((val,i)=>{
        let str=JSON.stringify(val);
        if(!str) return;
        params+=str
      })
      logger.info(String.cutByte(params,5000));
      success()
    })
  }
  console.log=function () {
    consoleLog(...arguments)
    wlog(...arguments);
  }
}

1,请求官方在接口上自动截断,尽量显示日志信息;

这个支持下。

回到顶部