faultLogger故障日志获取

在应用发生CPP_CRASH、JS_CRASH、APP_FREEZE后便于主动获取对应的崩溃日志信息。

HarmonyOS
2024-05-28 21:07:54
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
五行缺踹

核心代码解释

faultLogger.query()获取当前进程故障信息,该方法通过回调方式获取故障信息数组,故障信息数组内最多上报10份故障信息。FaultLogInfo故障信息数据结构,获取到的故障信息的数据结构主要包括。



名称




类型




说明


pid

number

故障进程的进程id

uid

number

故障进程的用户id

type

FaultType

故障类型

timestamp

number

日志生成时的秒级时间戳

reason

string

发生故障的原因

module

string

发生故障的模块

summary

string

故障的概要

fullLog

string

故障日志全文

核心代码如下:

崩溃模拟核:

//CreateCrashDialog.ets 
addFaultLog() { 
  switch (this.selectIndex) { 
    case 0: 
      promptAction.showToast({ message: '异常构造中' }) 
 
      setTimeout(() => { 
        let t = ['0', '1'] 
        logger.info(t[3].toString()) 
      }, 100) 
      break 
    case 1: 
      promptAction.showToast({ message: '异常构造中,完成后应用会知道退出,请重新进入应用抓取异常信息' }) 
      setTimeout(() => { 
        console.log(testNapi.add(0, 0)) 
      }, 100) 
    // process.abort(); 
 
      break 
    case 2: 
      promptAction.showToast({ message: '异常构造中,会出现冻屏,请退出重新进入应用抓取异常信息' }) 
      setTimeout(() => { 
        let index = 0 // 循环初始值 
        while (true) { 
          index++ 
          this.selectIndex = index % 2 
        } 
      }, 100) 
      break 
    default: 
      break 
  } 
}

崩溃信息查询:

//QueryCrashDialog.ets 
async catchFaultLog(queryType: number) { 
  //进行故障信息获取 
  //faultType 故障类型枚举 
  //NO_SPECIFIC  0  不区分故障类型 
  // CPP_CRASH 2  C++程序故障类型 
  // JS_CRASH  3  JS程序故障类型 
  // APP_FREEZE  4  应用程序卡死故障类型 
 
  // FaultLogInfo--value 故障信息数据结构,获取到的故障信息的数据结构。 
  let value = await faultLogger.query(queryType) 
  if (value) { 
    let len = value.length 
    // 未获取到异常日志 
    if (len === 0) { 
      this.showCrashMessage = '暂时没有异常信息' 
      return 
    } 
    //故障信息数量 
    this.showCrashMessage = `故障数量:${len} ` 
    for (let i = 0; i < len; i++) { 
      //pid  number  故障进程的进程id 
      // uid number  故障进程的用户id 
      // type  FaultType   故障类型 
      // timestamp number  日志生成时的秒级时间戳 
      // reason  string  发生故障的原因 
      // module  string  发生故障的模块 
      // summary string  故障的概要 
      // fullLog string  故障日志全文 
      // this.showCrashMessage.Message += `${DIVIDER} 
      this.showCrashMessage += `${DIVIDER} 
         故障进程的进程id: ${value[i].pid}\n 
         故障进程的用户id: ${value[i].uid}\n 
         故障类型:${value[i].type}\n 
         日志生成时的秒级时间戳:${value[i].timestamp}\n 
         发生故障的原因: ${value[i].reason}\n 
         发生故障的模块: ${value[i].module}\n 
         故障的概要: ${value[i].summary}\n 
         故障日志全文(截取前200字符):\n ${value[i].fullLog.substring(0, 200)}` 
      console.log("test" + `故障进程的进程id: ${value[i].pid}`) 
      console.log("test" + `故障进程的用户id: ${value[i].uid}`) 
      console.log("test" + `故障类型:${value[i].type}`) 
      console.log("test" + `日志生成时的秒级时间戳:${value[i].timestamp}`) 
      console.log("test" + `发生故障的原因: ${value[i].reason}`) 
      console.log("test" + `发生故障的模块: ${value[i].module}`) 
      console.log("test" + `故障的概要: ${value[i].summary}`) 
      console.log("test" + `故障日志全文(截取前200字符): ${value[i].fullLog.substring(0, 200)}`) 
    } 
  } 
} 
 
addFaultLog() { 
  switch (this.selectIndex) { 
    case 0: 
      promptAction.showToast({ message: 'JS_FAULT异常信息获取中' }) 
      this.catchFaultLog(faultLogger.FaultType.JS_CRASH) 
    // getLog(); 
      break 
    case 1: 
      promptAction.showToast({ message: 'J获取CPP_FAULT异常中' }) 
      this.catchFaultLog(faultLogger.FaultType.CPP_CRASH) 
      break 
    case 2: 
      promptAction.showToast({ message: '获取APP_FREEZE异常中' }) 
      this.catchFaultLog(faultLogger.FaultType.APP_FREEZE) 
      break 
    case 3: 
      promptAction.showToast({ message: '获取NO_SPECIFIC异常中' }) 
      this.catchFaultLog(faultLogger.FaultType.NO_SPECIFIC) 
      break 
    default: 
      break 
  } 
}

主要用于崩溃信息的主动获取,参考:faultLogger

实现效果


分享
微博
QQ
微信
回复
2024-05-29 22:13:34
相关问题
如何保存faultLogger ,有人知道吗?
636浏览 • 1回复 待解决
使用hiappevent获取崩溃日志的示例代码
1891浏览 • 1回复 待解决
数据表日志详情怎么获取好呢?
3222浏览 • 1回复 待解决
HarmonyOS 支持获取应用的crash日志
23浏览 • 1回复 待解决
当 Master 发生故障宕机时会怎么办?
3291浏览 • 1回复 待解决