#夏日挑战赛#HiLog API使用方法 原创 精华
本文正在参加星光计划3.0–夏日挑战赛
作者:陈会
一、什么是HiLog
HiLog是鸿蒙程序用来打印日志的工具,相比于默认的控制台(println
)输出,Log支持分级别过滤日志,方便按照关键字进行过滤等功能.
二、HiLog API的使用
2.1、定义日志标签
输出日志的接口由HiLog类提供。在输出日志前,需要先调用HiLog的辅助类HiLogLabel定义日志标签。
typedef struct HiLogLabel {
LogType type;
unsigned int domain;
const char *tag;
} HiLogLabel;
参数type:用于指定输出日志的类型。HiLog中当前只提供了四种日志类型,如下:
typedef enum {
LOG_TYPE_MIN = 0,
LOG_APP = 0,
LOG_INIT = 1,
// Used by core service, framework.
LOG_CORE = 3,
LOG_KMSG = 4,
LOG_TYPE_MAX
} LogType;
即:app、init、core和kmsg。
参数domain:用于指定输出日志所对应的业务领域,取值范围为0x0~0xFFFFF,开发者可以根据需要进行自定义。
参数tag:用于指定日志标识,可以为任意字符串,建议标识调用所在的类或者业务行为。这个标记最好独特,不与其他字符重复,这样方便查询。
开发者可以根据自定义参数domain和tag来进行日志的筛选和查找。
示例:
const HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "URI"};
2.2、日志级别
HiLog中定义了DEBUG、INFO、WARN、ERROR、FATAL五种日志级别,并提供了对应的方法用于输出不同级别的日志。
class HiLog final {
public:
static int Debug(const HiLogLabel &label, const char *fmt, ...) __attribute__((__format__(os_log, 2, 3)));
static int Info(const HiLogLabel &label, const char *fmt, ...) __attribute__((__format__(os_log, 2, 3)));
static int Warn(const HiLogLabel &label, const char *fmt, ...) __attribute__((__format__(os_log, 2, 3)));
static int Error(const HiLogLabel &label, const char *fmt, ...) __attribute__((__format__(os_log, 2, 3)));
static int Fatal(const HiLogLabel &label, const char *fmt, ...) __attribute__((__format__(os_log, 2, 3)));
};
HiLog::debug,用于打印调试信息,这些信息用于在开发过程中确认问题,对应级别为debug。
HiLog::info,用于打印重要性高一些的信息,对应级别为info,其显示优先级比debug高一级。
HiLog::warn,用于打印警告信息,表示出现了需要引起重视的情况,对应级别为warn,其显示优先级比info高一级。
HiLog::error,用于打印错误信息,表示出现了严重的问题,应尽快修复,对应级别为error,其显示优先级比warn高一级。
HiLog::fatal,用于打印错误信息,表示出现了致命的问题,应立即修复,对应级别为fatal,其显示优先级最高。
2.3、参数format
**参数format:**printf格式字符串,以%字符开头,用于日志的格式化输出。格式字符串中可以设置多个字符串,例如:“Failed to visit %s”,“%s”为参数类型的变参标识,具体取值在args中定义。
隐私标识:每个参数需要添加隐私标识,分为{public}和{private},默认为{private}。{public}表示日志打印结果可见;{private}标识日志打印不可见,显示为<private>。
**参数args:**可以为0个或多个参数,是格式字符串中参数类型对应的参数列表。参数的数量、类型必须与格式字符串中的标识一一对应。
示例:以输出一条ERROR级别的信息为例,
std::string message = "message";
int errno = -11;
HiLog::Error(LABEL, "Failed to get %{private}s, reason %{public}d.", message, errno);
输出的结果为:
01-01 04:38:00.049 379 519 E 00000/VsyncDistributor: Failed to get <private>, reason -11.
三、经验总结
hilog API使用方法:
1、在模块BUILD.gn文件中添加依赖
include_dirs += [ "//base/hiviewdfx/hilog/interfaces/native/innerkits/include" ]
external_deps = [ "hilog_native:libhilog" ]
2、头文件
include"hilog/log.h"
3、接口调用
代码示例(以下代码从系统源码中摘录)
#include <vector>
+#include "hilog/log.h"
#include "string_ex.h"
#include "uri.h"
using std::string;
using std::regex;
+using OHOS::HiviewDFX::HiLog;
namespace OHOS {
namespace {
@@ -39,6 +41,7 @@ namespace {
const size_t POS_INC_MORE = 2;
const size_t POS_INC_AGAIN = 3;
const regex SCHEME_REGEX("[a-zA-Z][a-zA-Z|\\d|+|-|.]*$");
+ const HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0xD001800, "URI"};
}; // namespace
Uri::Uri(const string& uriString)
@@ -48,6 +51,7 @@ Uri::Uri(const string& uriString)
port_ = NOT_CALCULATED;
if (uriString.empty()) {
+ HiLog::Error(LABEL, "Input empty!");
return;
}
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
感谢陈老师详细讲解