#夏日挑战赛#HiLog API使用方法 原创 精华

深开鸿
发布于 2022-6-24 19:04
浏览
2收藏

本文正在参加星光计划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开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
2
收藏 2
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

感谢陈老师详细讲解

回复
2022-6-27 10:16:16
回复
    相关推荐