1# @ohos.hilog (HiLog日志打印) 2 3<!--Kit: Performance Analysis Kit--> 4<!--Subsystem: HiviewDFX--> 5<!--Owner: @liuyifeifei;@buzhenwang--> 6<!--Designer: @shenchenkai--> 7<!--Tester: @liyang2235--> 8<!--Adviser: @foryourself--> 9 10hilog日志系统,使应用/服务可以按照指定级别、标识和格式字符串输出日志内容,帮助开发者了解应用/服务的运行状态,更好地调试程序。 11 12> **说明:** 13> 14> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 15 16## 导入模块 17 18```js 19import { hilog } from '@kit.PerformanceAnalysisKit'; 20``` 21 22## hilog.isLoggable 23 24isLoggable(domain: number, tag: string, level: LogLevel) : boolean 25 26在打印日志前调用该接口,用于检查指定领域标识、日志标识和级别的日志是否可以打印。 27 28**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 29 30**系统能力**:SystemCapability.HiviewDFX.HiLog 31 32**参数:** 33 34| 参数名 | 类型 | 必填 | 说明 | 35| ------ | --------------------- | ---- | ------------------------------------------------------------ | 36| domain | number | 是 | 日志对应的领域标识,范围是0x0~0xFFFF,超出范围则日志无法打印。<br/>建议开发者在应用内根据需要自定义划分。 | 37| tag | string | 是 | 指定日志标识,可以为任意字符串,建议用于标识调用所在的类或者业务行为。tag最多为31字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。 | 38| level | [LogLevel](#loglevel) | 是 | 日志级别。 | 39 40**返回值:** 41 42| 类型 | 说明 | 43| ------- | ------------------------------------------------------------ | 44| boolean | 如果返回true,则该领域标识、日志标识和级别的日志可以打印,否则不能打印。 | 45 46**示例:** 47 48```js 49hilog.isLoggable(0x0001, "testTag", hilog.LogLevel.INFO); 50``` 51 52## LogLevel 53 54日志级别。 55 56**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 57 58**系统能力**:SystemCapability.HiviewDFX.HiLog 59 60| 名称 | 值 | 说明 | 61| ----- | ------ | ------------------------------------------------------------ | 62| DEBUG | 3 | 详细的流程记录,通过该级别的日志可以更详细地分析业务流程和定位分析问题。 | 63| INFO | 4 | 用于记录业务关键流程节点,可以还原业务的主要运行过程;<br/>用于记录可预料的非正常情况信息,如无网络信号、登录失败等。<br/>这些日志都应该由该业务内处于支配地位的模块来记录,避免在多个被调用的模块或低级函数中重复记录。 | 64| WARN | 5 | 用于记录较为严重的非预期情况,但是对用户影响不大,应用可以自动恢复或通过简单的操作就可以恢复的问题。 | 65| ERROR | 6 | 应用发生了错误,该错误会影响功能的正常运行或用户的正常使用,可以恢复但恢复代价较高,如重置数据等。 | 66| FATAL | 7 | 重大致命异常,表明应用即将崩溃,故障无法恢复。 | 67 68## hilog.debug 69 70debug(domain: number, tag: string, format: string, ...args: any[]) : void 71 72打印DEBUG级别的日志。 73 74DEBUG级别的日志在正式发布版本中默认不被打印,只有在调试版本或打开调试开关的情况下才会打印。 75 76**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 77 78**系统能力**:SystemCapability.HiviewDFX.HiLog 79 80**参数:** 81 82| 参数名 | 类型 | 必填 | 说明 | 83| ------ | ------ | ---- | ------------------------------------------------------------ | 84| domain | number | 是 | 日志对应的领域标识,范围是0x0~0xFFFF,超出范围则日志无法打印。<br/>建议开发者在应用内根据需要自定义划分。 | 85| tag | string | 是 | 指定日志标识,可以为任意字符串,建议用于标识调用所在的类或者业务行为。tag最多为31字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。 | 86| format | string | 是 | 格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,参数需要包含参数类型、隐私标识。<br>隐私标识分为{public}和{private},缺省为{private}。标识{public}的内容明文输出,标识{private}的内容以\<private>过滤回显。 | 87| args | any[] | 否 | 与格式字符串format对应的可变长度参数列表。参数数目、参数类型必须与格式字符串中的标识一一对应。 | 88 89**示例:** 90 91输出一条DEBUG信息,格式字符串为`"%{public}s World %{private}d"`。其中变参`%{public}s`为明文显示的字符串;`%{private}d`为隐私的整型数。 92 93```js 94hilog.debug(0x0001, "testTag", "%{public}s World %{private}d", "hello", 3); 95``` 96 97字符串`"hello"`填入`%{public}s`,整型数`3`填入`%{private}d`,输出日志: 98 99``` 10008-05 12:21:47.579 2695 2703 D A00001/testTag: hello World <private> 101``` 102 103## hilog.info 104 105info(domain: number, tag: string, format: string, ...args: any[]) : void 106 107打印INFO级别的日志。 108 109**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 110 111**系统能力**:SystemCapability.HiviewDFX.HiLog 112 113**参数:** 114 115| 参数名 | 类型 | 必填 | 说明 | 116| ------ | ------ | ---- | ------------------------------------------------------------ | 117| domain | number | 是 | 日志对应的领域标识,范围是0x0~0xFFFF,超出范围则日志无法打印。<br/>建议开发者在应用内根据需要自定义划分。 | 118| tag | string | 是 | 指定日志标识,可以为任意字符串,建议用于标识调用所在的类或者业务行为。tag最多为31字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。 | 119| format | string | 是 | 格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,参数需要包含参数类型、隐私标识。<br/>隐私标识分为{public}和{private},缺省为{private}。标识{public}的内容明文输出,标识{private}的内容以\<private>过滤回显。 | 120| args | any[] | 否 | 与格式字符串format对应的可变长度参数列表。参数数目、参数类型必须与格式字符串中的标识一一对应。 | 121 122**示例:** 123 124输出一条INFO信息,格式字符串为`"%{public}s World %{private}d"`。其中变参`%{public}s`为明文显示的字符串;`%{private}d`为隐私的整型数。 125 126```js 127hilog.info(0x0001, "testTag", "%{public}s World %{private}d", "hello", 3); 128``` 129 130字符串`"hello"`填入`%{public}s`,整型数`3`填入`%{private}d`,输出日志: 131 132``` 13308-05 12:21:47.579 2695 2703 I A00001/testTag: hello World <private> 134``` 135 136## hilog.warn 137 138warn(domain: number, tag: string, format: string, ...args: any[]) : void 139 140打印WARN级别的日志。 141 142**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 143 144**系统能力**:SystemCapability.HiviewDFX.HiLog 145 146**参数:** 147 148| 参数名 | 类型 | 必填 | 说明 | 149| ------ | ------ | ---- | ------------------------------------------------------------ | 150| domain | number | 是 | 日志对应的领域标识,范围是0x0~0xFFFF,超出范围则日志无法打印。<br/>建议开发者在应用内根据需要自定义划分。 | 151| tag | string | 是 | 指定日志标识,可以为任意字符串,建议用于标识调用所在的类或者业务行为。tag最多为31字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。 | 152| format | string | 是 | 格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,参数需要包含参数类型、隐私标识。<br/>隐私标识分为{public}和{private},缺省为{private}。标识{public}的内容明文输出,标识{private}的内容以\<private>过滤回显。 | 153| args | any[] | 否 | 与格式字符串format对应的可变长度参数列表。参数数目、参数类型必须与格式字符串中的标识一一对应。 | 154 155**示例:** 156 157输出一条WARN信息,格式字符串为`"%{public}s World %{private}d"`。其中变参`%{public}s`为明文显示的字符串;`%{private}d`为隐私的整型数。 158 159```js 160hilog.warn(0x0001, "testTag", "%{public}s World %{private}d", "hello", 3); 161``` 162 163字符串`"hello"`填入`%{public}s`,整型数`3`填入`%{private}d`,输出日志: 164 165``` 16608-05 12:21:47.579 2695 2703 W A00001/testTag: hello World <private> 167``` 168 169## hilog.error 170 171error(domain: number, tag: string, format: string, ...args: any[]) : void 172 173打印ERROR级别的日志。 174 175**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 176 177**系统能力**:SystemCapability.HiviewDFX.HiLog 178 179**参数:** 180 181| 参数名 | 类型 | 必填 | 说明 | 182| ------ | ------ | ---- | ------------------------------------------------------------ | 183| domain | number | 是 | 日志对应的领域标识,范围是0x0~0xFFFF,超出范围则日志无法打印。<br/>建议开发者在应用内根据需要自定义划分。 | 184| tag | string | 是 | 指定日志标识,可以为任意字符串,建议用于标识调用所在的类或者业务行为。 tag最多为31字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。| 185| format | string | 是 | 格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,参数需要包含参数类型、隐私标识。<br/>隐私标识分为{public}和{private},缺省为{private}。标识{public}的内容明文输出,标识{private}的内容以\<private>过滤回显。 | 186| args | any[] | 否 | 与格式字符串format对应的可变长度参数列表。参数数目、参数类型必须与格式字符串中的标识一一对应。 | 187 188**示例:** 189 190输出一条ERROR信息,格式字符串为`"%{public}s World %{private}d"`。其中变参`%{public}s`为明文显示的字符串;`%{private}d`为隐私的整型数。 191 192```js 193hilog.error(0x0001, "testTag", "%{public}s World %{private}d", "hello", 3); 194``` 195 196字符串`"hello"`填入`%{public}s`,整型数`3`填入`%{private}d`,输出日志: 197 198``` 19908-05 12:21:47.579 2695 2703 E A00001/testTag: hello World <private> 200``` 201 202## hilog.fatal 203 204fatal(domain: number, tag: string, format: string, ...args: any[]) : void 205 206打印FATAL级别的日志。 207 208**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。 209 210**系统能力**:SystemCapability.HiviewDFX.HiLog 211 212**参数:** 213 214| 参数名 | 类型 | 必填 | 说明 | 215| ------ | ------ | ---- | ------------------------------------------------------------ | 216| domain | number | 是 | 日志对应的领域标识,范围是0x0~0xFFFF,超出范围则日志无法打印。<br/>建议开发者在应用内根据需要自定义划分。 | 217| tag | string | 是 | 指定日志标识,可以为任意字符串,建议用于标识调用所在的类或者业务行为。tag最多为31字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。 | 218| format | string | 是 | 格式字符串,用于日志的格式化输出。格式字符串中可以设置多个参数,参数需要包含参数类型、隐私标识。<br/>隐私标识分为{public}和{private},缺省为{private}。标识{public}的内容明文输出,标识{private}的内容以\<private>过滤回显。 | 219| args | any[] | 否 | 与格式字符串format对应的可变长度参数列表。参数数目、参数类型必须与格式字符串中的标识一一对应。 | 220 221**示例:** 222 223输出一条FATAL信息,格式字符串为`"%{public}s World %{private}d"`。其中变参`%{public}s`为明文显示的字符串;`%{private}d`为隐私的整型数。 224 225```js 226hilog.fatal(0x0001, "testTag", "%{public}s World %{private}d", "hello", 3); 227``` 228 229字符串`"hello"`填入`%{public}s`,整型数`3`填入`%{private}d`,输出日志: 230 231``` 23208-05 12:21:47.579 2695 2703 F A00001/testTag: hello World <private> 233``` 234 235## hilog.setMinLogLevel<sup>15+</sup> 236 237setMinLogLevel(level: LogLevel): void 238 239设置应用日志打印的最低日志级别,用于拦截低级别日志打印。 240 241需要注意:如果设置的日志级别低于[全局日志级别](../../dfx/hilog.md#查看和设置日志级别),设置不生效。 242 243**原子化服务API**:从API version 15开始,该接口支持在原子化服务中使用。 244 245**系统能力**:SystemCapability.HiviewDFX.HiLog 246 247**参数:** 248 249| 参数名 | 类型 | 必填 | 说明 | 250| ------ | --------------------- | ---- | ------------------------------------------------------------ | 251| level | [LogLevel](#loglevel) | 是 | 日志级别。 | 252 253**示例:** 254 255以全局日志级别为INFO下,打印5条不同级别的hilog日志,在打印过程中调用两次setMinLogLevel接口为例: 256 257```js 258hilog.info(0x0001, "testTag", 'this is an info level log, id: %{public}d', 1); 259hilog.setMinLogLevel(hilog.LogLevel.WARN); 260hilog.info(0x0001, "testTag", 'this is an info level log, id: %{public}d', 2); 261hilog.error(0x0001, 'testTag', 'this is an error level log, id: %{public}d', 3); 262hilog.setMinLogLevel(hilog.LogLevel.DEBUG); 263hilog.debug(0x0001, "testTag", 'this is a debug level log, id: %{public}d', 4); 264hilog.info(0x0001, "testTag", 'this is an info level log, id: %{public}d', 5); 265``` 266 267由于全局日志起始为INFO,第一条日志可以正常打印。 268 269在设置进程最低可打印日志级别为WARN后,第二条日志不符合该日志级别,第二条日志打印失败,第三条日志可以正常打印。 270 271在设置进程最低日志级别为DEBUG后,但是此时全局日志级别为INFO,所以第四条日志不满足全局日志级别,打印失败,第五条日志可以打印。 272 273<!--RP1--> 274最终打印结果如下所示: 275``` 27608-07 23:50:01.532 13694-13694 A00001/testTag com.example.hilogDemo I this is an info level log, id: 1 27708-07 23:50:01.532 13694-13694 A00001/testTag com.example.hilogDemo E this is an error level log, id: 3 27808-07 23:50:01.532 13694-13694 A00001/testTag com.example.hilogDemo I this is an info level log, id: 5 279``` 280<!--RP1End--> 281 282## 参数格式符 283 284上述接口中,日志打印的格式化参数需按照如下格式打印: 285 286%{[private flag]}specifier 287 288| 隐私标识符(private flag) | 说明 | 289| ------------ | ---- | 290| 无 | 缺省值默认为private,不打印明文参数。 | 291| private | 隐私参数类型,不打印明文参数。 | 292| public | 明文显示参数。 | 293 294| 格式说明符(specifier) | 说明 | 示例 | 295| ------------ | ---- | ---- | 296| d/i | 支持打印number和bigint类型。 | 123 | 297| s | 支持打印string undefined bool 和null类型。 | "123" | 298| o/O | 支持打印object、undefined和null类型。<br>从API version 20开始,支持该能力。 | { 'name': "Jack", 'age': 22 } | 299 300**示例:** 301```js 302let testObj: Record<string, string | number> = { 303 'name': "Jack", 304 'age': 22 305} 306let isBol = true; 307let bigNum = BigInt(1234567890123456789); 308hilog.info(0x0001, "jsHilogTest", "print object: %{public}s", JSON.stringify(testObj)); 309hilog.info(0x0001, "jsHilogTest", "print object: %{public}o", testObj); 310hilog.info(0x0001, "jsHilogTest", "private flag: %{private}s %s, print null: %{public}s", "hello", "world", null); 311hilog.info(0x0001, "jsHilogTest", "print undefined: %{public}s", undefined); 312hilog.info(0x0001, "jsHilogTest", "print number: %{public}d %{public}i", 123, 456); 313hilog.info(0x0001, "jsHilogTest", "print bigNum: %{public}d %{public}i", bigNum, bigNum); 314hilog.info(0x0001, "jsHilogTest", "print boolean: %{public}s", isBol); 315``` 316 317**打印结果:** 318``` 31908-09 13:26:29.094 2266 2266 I A00001/jsHilogTest: print object: {"name":"Jack","age":22} 32008-09 13:26:29.094 2266 2266 I A00001/jsHilogTest: print object: {"name":"Jack","age":22} 32108-09 13:26:29.094 2266 2266 I A00001/jsHilogTest: private flag: <private> <private>, print null: null 32208-09 13:26:29.094 2266 2266 I A00001/jsHilogTest: print undefined: undefined 32308-09 13:26:29.094 2266 2266 I A00001/jsHilogTest: print number: 123 456 32408-09 13:26:29.095 2266 2266 I A00001/jsHilogTest: print bigNum: 1234567890123456768 1234567890123456768 32508-09 13:26:29.095 2266 2266 I A00001/jsHilogTest: print boolean: true 326```