HarmonyOS 日志打印丢失

257 阅读1分钟

问题描述

使用HarmonyOS SDK API9开发应用时,偶发日志打印不全,原因在很早之前已经定位出来了,并且也做了相应的长日志打印处理。今天无意间发现,还是有日志缺失现象。

丢失原因

console.log 对日志长度有限制,不能大于1024个字节

解决方案

重新封装日志打印接口

功能已验证,使用毫无压力

import util from '@ohos.util'

export default class Logger {

    static d(...content: string[]){
       let tempContent: string = content.map(String).join(' ')
       this.tag('Harvey', tempContent)
    }

    static tag(TAG: string, content: string){
      let MAX_LENGTH: number = 1024 //单位:字节

      //截取日志字符串的起始下标 
      let startIndex: number = 0
      //截取日志字符串的结束下标
      let endIndex: number = 0

      //起始下标值默认为0
      startIndex = 0
      
      //结束下标由于字符串未转换为字节,因此先以日志字符串长度与1024做对比
      if(content.length >= MAX_LENGTH){
        endIndex = MAX_LENGTH
      } else {
        endIndex = content.length + 1
      }

      let encode = new util.TextEncoder()

      //以字符串长度做为循环截取依据
      for(let a = 0; a < content.length; ){

        //截取一段日志
        let mid = content.substring(startIndex, endIndex)
        
        //转换为utf8编码字节
        let contentWithByte = encode.encodeInto(mid)

        //以截取字符串的真实字节长度循环调整结束下标
        while (contentWithByte.byteLength >= MAX_LENGTH) {
          //字节数大于1024,则结束下标减少1,即减少一个字符
          endIndex = endIndex - 1
          
          //重新截取日志字符串
          mid = content.substring(startIndex, endIndex)
          //重新转换为utf8编码字节
          contentWithByte = encode.encodeInto(mid)
        }

        //打印长度合适的日志
        console.log(mid);

        //偏移日志字符串截取的下标
        a = endIndex
        startIndex = endIndex

        if(endIndex + MAX_LENGTH <= content.length){
           endIndex = endIndex + MAX_LENGTH
        } else {
           endIndex = content.length + 1
        }

      }

    }

}