HarmonyOS NEXT鸿蒙开发:HiLog日志打印(与console的比较)

介绍

在应用开发过程中,可在关键代码处输出日志信息。在运行应用后,通过查看日志信息来分析应用执行情况(如应用是否正常运行、代码运行时序、运行逻辑分支是否正常等)

类比:相当于 Log4j日志

权限级别

定义了DEBUG、INFO、WARN、ERROR、FATAL五种日志级别

DEBUG

值:3

详细的流程记录,通过该级别的日志可以更详细地分析业务流程和定位分析问题。

INFO

值:4

用于记录业务关键流程节点,可以还原业务的主要运行过程;

用于记录可预料的非正常情况信息,如无网络信号、登录失败等。

这些日志都应该由该业务内处于支配地位的模块来记录,避免在多个被调用的模块或低级函数中重复记录。

WARN

值:5

用于记录较为严重的非预期情况,但是对用户影响不大,应用可以自动恢复或通过简单的操作就可以恢复的问题。

ERROR

值:6

应用发生了错误,该错误会影响功能的正常运行或用户的正常使用,可以恢复但恢复代价较高,如重置数据等。

FATAL

值:7

重大致命异常,表明应用即将崩溃,故障无法恢复。

导入模块

import { hilog } from '@kit.PerformanceAnalysisKit';

打印日志方法

hilog.debug

打印DEBUG级别的日志。DEBUG级别的日志在 正式发布版本中默认不被打印,只有在调试版本或打开调试开关的情况下才会打印。

debug(domain: number, tag: string, format: string, ...args: any[]) : void
参数
  • domain:类型:number,必填,日志对应的领域标识,范围是0x0~0xFFFF。建议开发者在应用内根据需要自定义划分。

  • tag:类型:string,必填,指定日志标识,可以为任意字符串,建议用于标识调用所在的类或者业务行为。tag最多为 31 字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。

  • format:类型:string,必填,格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,参数需要包含参数类型、隐私标识。
    隐私标识:分为 {public} 和 {private},缺省为 {private}。标识 {public} 的内容明文输出,标识 {private} 的内容以 <private> 过滤回显。
    类型:

    • s 表示字符串
    • d 表示number类型
    • i 表示bigint类型
  • args:类型:any[],与格式字符串对应的参数列表。参数数量、类型 必须与格式字符串中的标识一一对应。

例子1

输出一条DEBUG信息:

hilog.debug(0x0001, "testTag", "%{public}s World %{private}d", "hello", 3);

解释:

  • %{public}s:为明文显示的字符串,字符串 "hello" 填入 %{public}s
  • %{private}d:为隐私的整型数,整型数 3 填入 %{private}d

打印结果:

08-05 12:21:47.579  2695 2703 D A00001/testTag: hello World <private>

解释:

  • D:表示 debug
  • A00001:表示 0x0001

hilog.info

打印INFO级别的日志。

info(domain: number, tag: string, format: string, ...args: any[]) : void
参数

与 hilog.debug 相同

例子

let testObj: Record<string, string | number> = {
    'name': "Jack",
    'age': 22
}
let isBol = true;
let bigNum = BigInt(1234567890123456789);
hilog.info(0x0001, "jsHilogTest", "print object: %{public}s", JSON.stringify(testObj));
hilog.info(0x0001, "jsHilogTest", "private flag: %{private}s %s, print null: %{public}s", "hello", "world", null);
hilog.info(0x0001, "jsHilogTest", "print undefined: %{public}s", undefined);
hilog.info(0x0001, "jsHilogTest", "print number: %{public}d %{public}i", 123, 456);
hilog.info(0x0001, "jsHilogTest", "print bigNum: %{public}d %{public}i", bigNum, bigNum);
hilog.info(0x0001, "jsHilogTest", "print boolean: %{public}s", isBol);

打印结果

08-09 13:26:29.094  2266  2266 I A00001/jsHilogTest: print object: {"name":"Jack","age":22}
08-09 13:26:29.094  2266  2266 I A00001/jsHilogTest: private flag: <private> <private>, print null: null
08-09 13:26:29.094  2266  2266 I A00001/jsHilogTest: print undefined: undefined
08-09 13:26:29.094  2266  2266 I A00001/jsHilogTest: print number: 123 456
08-09 13:26:29.095  2266  2266 I A00001/jsHilogTest: print bigNum: 1234567890123456768 1234567890123456768
08-09 13:26:29.095  2266  2266 I A00001/jsHilogTest: print boolean: true

hilog.warn

打印WARN级别的日志。

warn(domain: number, tag: string, format: string, ...args: any[]) : void
参数

与 hilog.debug 相同

hilog.error

打印ERROR级别的日志。

error(domain: number, tag: string, format: string, ...args: any[]) : void
参数

与 hilog.debug 相同

hilog.fatal

打印FATAL级别的日志。

fatal(domain: number, tag: string, format: string, ...args: any[]) : void
参数

与 hilog.debug 相同

与 console 比较

console 是对 HiLog 的封装,使用时相对简单

比较:

const DOMAIN = 0x0000;
const TAG = "授权(RequestPermissions.ets)-----"


hilog.error(DOMAIN, TAG, 'context不能为空');
console.error( 'context不能为空');

执行结果:

12-19 10:29:21.914   21209-21209   A00000/授权(Requ...issions.ets)-  com.examp...lication  E     context不能为空
12-19 10:29:21.914   21209-21209   A03d00/JSAPP                    com.examp...lication  E     context不能为空

结论

  • hilog.error 的 DOMAIN、TAG 可以自定义
  • console 的 DOMAIN 是固定值 A03d00
  • console 的 tag 是固定值 JSAPP