鸿蒙中 错误日志和崩溃日志上报

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

鸿蒙(HarmonyOS)中,系统提供了完整的错误日志和崩溃日志上报机制,包含现成的API和工具类支持。具体实现,如下:

一系统原生API支持

  1. 错误管理(errorManager)
    • 功能:捕获应用未处理的异常(如JS Crash),支持自定义错误回调。
    • 核心API
     import errorManager from '@ohos.app.ability.errorManager';
     
     // 注册错误监听
     const observerId = errorManager.on('error', {
       onUnhandledException: (errMsg) => {
         console.error('崩溃信息:', errMsg);
         // 上报逻辑
       }
     });
     
     // 注销监听
     errorManager.off('error', observerId);
  • 特点
    • 可防止应用闪退,捕获异常后仍可执行上报逻辑 。

    2. 故障日志(faultLogger)

  1. 功能:记录Native崩溃日志(如C++层错误),支持异步查询。
  2. 使用示例
     import faultLogger from '@ohos.faultLogger';
     
     // 查询崩溃日志
     const logs = faultLogger.query(faultLogger.FaultType.JS_CRASH);
     logs.forEach(log => {
       console.log('崩溃堆栈:', log.log);
       // 上报到服务器
     });
  • 适用场景
    • 适用于Native层崩溃分析,需下次启动时查询 。

二、日志采集与分析工具

  1. HiLog日志系统
    • 功能:分类记录调试日志(DEBUG/INFO/ERROR等),支持按模块过滤。
    • 示例代码
     import hilog from '@ohos.hilog';
     
     const TAG = 'MyApp';
     hilog.error(0x0000, TAG, '错误日志: %{public}s', '网络请求超时');
  • 优势
    • 支持日志级别控制,敏感数据可通过%{public}s脱敏 。

   2. 可视化工具

  1. LTS Viewer:分析时间轴日志,定位性能瓶颈。
  2. HiTrace:追踪分布式调用链,适用于复杂交互场景 。

三、完整上报方案实现

1. 全局异常捕获工具类(推荐)
import errorManager from '@ohos.app.ability.errorManager';
import { BusinessError } from '@kit.BasicServicesKit';
import { FileUtil } from './FileUtil'; // 自定义文件工具

export class CrashReporter {
  private static observerId: number | undefined;

  static init() {
    if (this.observerId === undefined) {
      this.observerId = errorManager.on('error', {
        onUnhandledException: (errMsg) => {
          const log = `${new Date().toISOString()}\n${errMsg}\n`;
          FileUtil.writeLog(log); // 写入本地
          this.uploadToServer(log); // 上报服务器
        }
      });
    }
  }

  private static uploadToServer(log: string) {
    // 使用HTTP或RPC接口上报
  }
}

// 在Ability中初始化
CrashReporter.init();

功能

  • 自动捕获异常并持久化日志
  • 支持断网时缓存日志,联网后重传 
2. 崩溃分析服务集成
import faultLogger from '@ohos.faultLogger';
import http from '@ohos.net.http';

// 上报Native崩溃
const logs = faultLogger.query(faultLogger.FaultType.CPP_CRASH);
logs.forEach(log => {
  http.request({
    url: 'https://api.example.com/crash',
    method: 'POST',
    data: JSON.stringify(log)
  });
});

注意:需声明ohos.permission.READ_CRASH_LOG权限。

四、权限与配置

  1. 必备权限声明 在module.json5中添加:
   {
     "requestPermissions": [
       {
         "name": "ohos.permission.READ_CRASH_LOG",
         "reason": "用于崩溃分析"
       },
       {
         "name": "ohos.permission.INTERNET",
         "reason": "上报日志到服务器"
       }
     ]
   }

   2. 安全建议

  • 敏感日志脱敏处理(如用户ID)
  • 使用HTTPS加密传输 
     
### 鸿蒙系统 LOG 日志打印方法 #### 使用 HiLog 工具类进行日志记录 在鸿蒙操作系统中,`HiLog` 是官方推荐的日志工具类。通过 `HiLog` 可以方便地输出不同级别的日志信息,如调试、信息、警告错误等[^1]。 ```cpp #include "hilog/log.h" // 定义模块名标签 #define MODULE_NAME "MyModule" #define TAG "MyTag" int main() { // 打印调试级别日志 HILOG_DEBUG(LOG_CORE, "[TAG] This is a debug message."); // 打印信息级别日志 HILOG_INFO(LOG_APP, "[TAG] Application started successfully."); // 打印警告级别日志 HILOG_WARN(LOG_APP, "[TAG] Warning: Resource might be low."); // 打印错误级别日志 HILOG_ERROR(LOG_APP, "[TAG] Error occurred while processing request."); return 0; } ``` #### 封装自定义 Log 类 为了简化日志操作并提高代码可读性,可以创建一个简单的封装类来处理常见的日志需求[^2]。 ```cpp class MyLogger { public: static void Debug(const char* tag, const char* format, ...) { va_list args; va_start(args, format); HILOG_VDEBUG(LOG_APP, "[%s] %s", tag, format, args); va_end(args); } static void Info(const char* tag, const char* format, ...) { va_list args; va_start(args, format); HILOG_VINFO(LOG_APP, "[%s] %s", tag, format, args); va_end(args); } }; ``` #### 解决无法查看日志的问题 有时开发者会遇到即使调用了 `HiLog` 函数也无法看到预期的日志输出的情况。这通常是因为设备上的日志权限设置不当或是日志缓冲区已满等原因造成的。确保应用程序具有足够的权限访问日志服务,并且定期清理过期的日志数据可以帮助解决此类问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值