在前面【鸿蒙】创建你的第一个Harmony项目我们已经能够顺利的编译并运行我们的第一个程序hello world!
为了今后能走的更远,我们现在需要点基础的装备,日志工具。学会了日志工具的使用方法,会对我们以后的Harmony应用开发带来极大的帮助。
使用HarmonyOS的日志工具HiLog
HarmonyOS提供了HiLog日志系统(Android的日志工具是Log),让应用可以按照指定类型、指定级别、指定格式字符串输出日志内容,帮助开发者了解应用的运行状态,更好地调试程序。
输出日志的接口由HiLog类提供。在输出日志前,需要先调用HiLog的辅助类HiLogLabel定义日志标签。
这个类提供了以下5种方法供我们调用:
HiLog.debug():用于输出DEBUG级别的日志。DEBUG级别日志表示仅用于应用调试,默认不输出,输出前需要在设备的“开发人员选项”中打开“USB调试”开关。对应Android的Log.d();
HiLog.info():用于输出INFO级别的日志。INFO级别日志表示普通的信息。对应Android的Log.i();
HiLog.warn():用于输出WARN级别的日志。WARN级别日志表示存在警告。对应Android的Log.w();
HiLog.error():用于输出ERROR级别的日志。ERROR级别日志表示存在错误。对应Android的Log.e();
HiLog.fatal():用于输出FATAL级别的日志。FATAL级别日志表示出现致命错误、不可恢复错误。Android应用崩溃时,也能看到fatal的崩溃信息,但这部分是系统打出,不对外提供主动调用FATAL级别的日志接口。
HiLog日志不像Android那样有不少重载方法,在这里HiLog日志每个日志级别的接口原型只有一个。
如:
debug(HiLogLabel label, String format, Object... args) |
info(HiLogLabel label, String format, Object... args) |
warn(HiLogLabel label, String format, Object... args) |
error(HiLogLabel label, String format, Object... args) |
fatal(HiLogLabel label, String format, Object... args) |
比起常见的android参数,这里多出来一个HiLogLabel标签
什么是HiLogLabel标签?
他其实是HiLog类的辅助类,用于定义日志标签,包括日志类型,服务域和标记。
他的定义原型是
- 参数type:用于指定输出日志的类型。HiLog中当前只提供了一种日志类型,即应用日志类型LOG_APP。
- 参数domain:用于指定输出日志所对应的业务领域,取值范围为0x0~0xFFFFF,开发者可以根据需要进行自定义。
- 参数tag:用于指定日志标识,可以为任意字符串,建议标识调用所在的类或者业务行为。
至于为什么要设计这样一个标签?我的理解是鸿蒙想帮助开发者从另一个维度去自定义参数domain和tag来进行日志的快速筛选和查找。
注:
本篇章仅介绍日志的基本概念和使用,有兴趣的读者请参看api文档:https://developer.harmonyos.com/en/docs/documentation/doc-references/hiloglabel-0000001054838842
Android的接口原型一般为
Log.i(String tag,String msg) |
- 参数tag:用于过滤日志的tag标签
- 参数msg:需要打印的日志信息
从接口调用的参数来看,鸿蒙的HiLog帮开发者实现了string的格式化,因为在日常日志输出时,经常会碰到日志拼接格式化的问题,虽然是个小细节,但也能看出鸿蒙os的热心。
日志使用示例
package com.example.helloword;
import com.example.helloword.slice.MainAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
public class MainAbility extends Ability {
//定义HiLogLabel
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 9527, "MainAbility.class");
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(MainAbilitySlice.class.getName());
//打印日志
HiLog.info(LABEL_LOG, "[%s] test HiLog!", "tomes");
}
}