HarmonyOS开发 - 日志打印

在程序开发过程中,日志输出是不可或缺的一部分。能有效的记录和分析日志数据,使开发人员可以更好地了解程序的运行状况、解决问题、优化性能并满足合规性要求等。

当程序出现错误或异常时,日志记录输出可以帮助开发人员快速定位问题发生的位置和原因;通过分析日志,开发人员可以了解程序在出错前后的状态和行为,从而更有效地进行调试。

在HarmonyOS中,提供了HiLog日志系统,让应用/服务可以按照指定类型、指定级别、指定格式字符串打印日志内容,帮助开发者了解应用/服务的运行状态,更好地调试程序。

当然,对于习惯前端开发人员,HarmonyOS也提供了Console的调试控制台,类似于浏览器提供的JavaScript控制台机制。

一、HiLog日志打印

HiLog中定义了DEBUG、INFO、WARN、ERROR、FATAL五种日志级别,并提供了对应的方法用于打印不同级别的日志,如下表所示:

序号 接口名 描述
1 debug​(domain: number, tag: string, format: string, ...args: any[]) 打印DEBUG级别的日志。DEBUG级别日志表示仅用于应用/服务调试,默认不打印,打印前需要在设备的"开发人员选项"中打开"USB调试"开关。
2 info​(domain: number, tag: string, format: string, ...args: any[]) 打印INFO级别的日志。INFO级别日志表示普通的信息。
3 warn​(domain: number, tag: string, format: string, ...args: any[]) 打印WARN级别的日志。WARN级别日志表示存在警告。
4 error​(domain: number, tag: string, format: string, ...args: any[]) 打印ERROR级别的日志。ERROR级别日志表示存在错误。
5 fatal​(domain: number, tag: string, format: string, ...args: any[]) 打印FATAL级别的日志。FATAL级别日志表示出现致命错误、不可恢复错误。

参数说明如下表:

序号 名称 描述
1 domain 用于指定打印日志所对应的业务领域,取值范围为0x0~0xFFFFF,开发者可以根据需要进行自定义。
2 tag 用于指定日志标识,可以为任意字符串,建议标识调用所在的类或者业务行为。
3 format 格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,例如格式字符串为"Failed to visit %s.","%s"为参数类型为string的变参标识,具体取值在args中定义。 每个参数需添加隐私标识,分为{public}或{private},默认为{private}。{public}表示日志打印结果可见;{private}表示日志打印结果不可见,输出结果为<private>。
4 args 可以为0个或多个参数,是格式字符串中参数类型对应的参数列表。参数的数量、类型必须与格式字符串中的标识一一对应。

例如,在创建一个新项目中,打开entryability/EntryAbility.ts文件,其中使用了HiLog来记录App启动过程,代码如下:

TypeScript 复制代码
import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

export default class EntryAbility extends UIAbility {
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/RouterPage', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

这是使用虚拟机启动后的控制台输出结果,如下图:

当控制台内容较多时,只显示自己需要的信息,则可以通过tag进行筛选,在搜索框中填写输出信息的tag标识即可,如上示例中日志输出tag标识为testTag。

二、console控制台

Console控制台中定义了debug、log、info、warn、error、assert等六种日志级别。

具体如下表:

序号 名称 描述
1 debug(message: string, ...arguments: any[]) 输出方式打印调试信息。 从API version 9开始,该接口支持在ArkTS卡片中使用。
2 log(message: string, ...arguments: any[]) 输出方式打印日志信息。 从API version 9开始,该接口支持在ArkTS卡片中使用。
3 info(message: string, ...arguments: any[]) 输出方式打印日志信息。(console.log()的别名)。 从API version 9开始,该接口支持在ArkTS卡片中使用。
4 warn(message: string, ...arguments: any[]) 输出方式打印警告信息。 从API version 9开始,该接口支持在ArkTS卡片中使用。
5 error(message: string, ...arguments: any[]) 输出方式打印错误信息。 从API version 9开始,该接口支持在ArkTS卡片中使用。
6 assert(message: string, ...arguments: any[]) 断言打印。 从API version 10+开始,该接口支持在ArkTS卡片中使用。

console.info示例代码如下:

TypeScript 复制代码
@Entry
@Component
struct ButtonPage {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Button("点击事件").onClick(() => {
          console.log('clickTest', '这是一个按钮点击事件');
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

控制台输出结果如下:

其官网ArkTS API给出的示例,可以进行格式化输出,地址:文档中心,如下代码:

TypeScript 复制代码
const number = 5;
console.log('count: %d', number);  // 格式化输出替换message中的文本。
// count: 5 
console.log('count:', number);  // 打印message以及其余信息
// count: 5 
console.log('count:'); // 仅打印message
// count: 

但是项目中测试格式化输出无效,不过也不必过于纠结此问题,可以使用模板字符串来代替格式输出功能,代码如下:

TypeScript 复制代码
const number = 5;
console.log(`cout ${number}`);  // 格式化输出替换message中的文本。
// count: 5 
相关推荐
ZJ_.13 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
joan_851 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
还是大剑师兰特1 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
枫叶丹44 小时前
【HarmonyOS之旅】HarmonyOS开发基础知识(三)
华为od·华为·华为云·harmonyos
一个处女座的程序猿O(∩_∩)O4 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
SoraLuna9 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
燃先生._.10 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖11 小时前
[react]searchParams转普通对象
开发语言·前端·javascript