如何使用 HiLog 进行高效的日志管理和调试?

新手上路,请多包涵

我想问的是,在应用运行过程中,经常会发生异常或错误,这些是不可避免的哈。

为了方便开发者快速定位和解决 Bug,如何使用 HiLog 有效地记录错误日志?特别是在 try-catch 代码块中捕获到异常时,开发者应该如何最佳实践地使用 HiLog 记录详细的异常信息 (例如,异常类型、错误堆栈、错误发生位置等),以便于后续的问题追踪和复现?

希望大家能分享一下 HiLog 在异常处理和错误日志记录中的最佳实践方法,最好能提供代码示例进行说明。

阅读 698
1 个回答
新手上路,请多包涵

try-catch 代码块中捕获到异常时,正是记录错误日志的最佳时机。因为 catch 块意味着代码执行过程中出现了非预期的情况,需要记录下来以便后续分析。以下是在 try-catch 中使用 HiLog 记录错误日志的基本方法:

import hilog from '@ohos.hilog';

class MyComponent extends View {
  build() {
    Button('可能出错的按钮')
      .onClick(() => {
        try {
          // 可能会抛出异常的代码
          this.riskyFunction();
        } catch (e) {
          // 捕获到异常,记录错误日志
          hilog.error(0x0010, 'MyTag', 'An error occurred: %{public}s', e.message);
          // 可以在此处进行错误处理,例如提示用户、上报错误等
          prompt.showToast({ message: '发生错误,请稍后重试' });
        }
      })
  }

  riskyFunction() {
    // 模拟一个可能抛出异常的函数
    throw new Error('Something went wrong in riskyFunction!');
  }
}

记录详细的异常信息

如何在 HiLog 中记录这些详细的异常信息呢?我们可以利用 JavaScript 异常对象e的属性,并结合 HiLog 的日志格式化功能:

import hilog from '@ohos.hilog';

class MyComponent extends View {
  build() {
    Button('可能出错的按钮 (详细日志)')
      .onClick(() => {
        try {
          this.riskyFunction();
        } catch (e) {
          // 记录详细的异常信息
          hilog.error(0x0010, 'MyTag', 'Error Caught: Type=%{public}s, Message=%{public}s, Stack: %{public}s',
            e.name, e.message, e.stack);
          prompt.showToast({ message: '发生错误 (详细日志),请查看日志' });
        }
      })
  }

  riskyFunction() {
    // 模拟一个可能抛出异常的函数
    console.log("Simulating error location inside riskyFunction"); // 可以通过 console.log 辅助定位
    throw new TypeError('Invalid type encountered in riskyFunction!'); // 抛出 TypeError 异常
  }
}

最佳实践错误日志记录

import hilog from '@ohos.hilog';

class DataService {
  userId: string = 'user123'; // 模拟用户ID

  async fetchDataFromServer(dataId: string): Promise<any> {
    try {
      // 模拟网络请求 (可能会抛出异常)
      const response = await this.simulateNetworkRequest(dataId);
      return response.data;
    } catch (error) {
      // 最佳实践:记录详细的异常信息和上下文
      hilog.error(0x0010, 'DataServiceTag', 'Failed to fetch data from server, DataID=%{public}s, UserID=%{public}s, ErrorType=%{public}s, ErrorMessage=%{public}s, Stack: %{public}s',
        dataId, this.userId, error.name, error.message, error.stack); // 记录 DataID, UserID 作为上下文
      throw new Error('DataServiceError: Failed to fetch data. See logs for details.'); // 可以选择抛出自定义错误,方便上层处理
    }
  }

  private async simulateNetworkRequest(dataId: string): Promise<any> {
    // 模拟一个异步网络请求 (可能失败)
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        const random = Math.random();
        if (random < 0.3) { // 30% 概率模拟网络请求失败
          reject(new Error(`Network request failed for DataID: ${dataId}, RandomValue: ${random}`)); // 模拟网络请求失败异常
        } else {
          resolve({ data: `Data for ID: ${dataId}, RandomValue: ${random}` }); // 模拟网络请求成功
        }
      }, 500); // 模拟 500ms 延迟
    });
  }
}

class MyComponent extends View {
  dataService: DataService = new DataService(); // 数据服务实例

  build() {
    Button('请求数据 (详细日志)')
      .onClick(async () => {
        try {
          const data = await this.dataService.fetchDataFromServer('data1001'); // 请求数据,可能抛出异常
          console.log('Data fetched successfully:', data);
          prompt.showToast({ message: '数据请求成功,请查看控制台' });
        } catch (error) {
          // 在上层组件的 catch 块中,可以根据需要记录 warn 级别的日志,并进行用户提示
          hilog.warn(0x0010, 'MyComponentTag', 'Data fetch failed, Error: %{public}s', error.message); // 记录 warn 级别日志
          prompt.showToast({ message: '数据请求失败,请稍后重试 (详细日志)' });
        }
      });
  }
}
  • 使用 hilog.error() 记录 ERROR 级别日志,或 hilog.warn() 记录 WARN 级别日志,根据错误严重程度选择合适级别。
  • 记录详细的异常信息,包括异常类型 (e.name)、错误消息 (e.message)、错误堆栈 (e.stack)
  • 在日志消息中补充记录关键上下文信息,例如用户信息、设备信息、请求参数、函数名等,帮助更全面地了解错误场景。
  • 编写有意义的日志消息,力求简洁明了,信息丰富,能够清晰地表达错误原因和影响。
  • 避免过度日志,只记录必要的错误日志,并注意日志脱敏,保护用户隐私。
  • 在不同层级的组件中,可以根据需要记录不同级别的日志,实现分层日志管理。

以上是我的回答,欢迎大家随时交流。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题