OpenHarmony子系统开发 - DFX(六)

OpenHarmony子系统开发 - DFX(六) 

HiSysEvent开发指导(二)

四、HiSysEvent订阅

概述

功能简介

HiSysEvent提供了跨进程订阅机制,开发者可以通过注册订阅接口实时获取关注的事件,例如电池模块订阅功耗相关的事件,用于分析耗电情况。

约束与限制

在订阅HiSysEvent事件之前,需要先完成HiSysEvent打点配置,具体配置方法请参考《HiSysEvent打点配置指导》

开发指导

接口说明

C++接口说明

C++ HiSysEvent订阅开发能力如下:HiSysEventManager类,具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。

icon-note.gif

说明:

ListenerRule订阅规则对象构造函数形参类型RuleType请参考HiSysEvent查询中的“表4 RuleType匹配规则类型枚举”说明。

表1 HiSysEvent订阅接口

接口名称描述
int32_t HiSysEventManager::AddListener(std::shared_ptr<HiSysEventListener> listener,
 std::vector<ListenerRule>& rules)
接口功能:添加对系统事件的订阅,通过设置规则订阅某些特定的事件。
输入参数:
- listener:订阅回调对象。
- rules:事件订阅规则。
返回值:
- 0:订阅添加成功。
- 负值:订阅添加失败。
int32_t HiSysEventManager::RemoveListener(std::shared_ptr<HiSysEventListener> listener)接口功能:移除对系统事件的订阅。
输入参数:
- listener:订阅回调对象。
返回值:
- 0:订阅移除成功。
- 负值:订阅移除失败。

表2 ListenerRule订阅规则对象

接口名称描述
ListenerRule(const std::string& tag,
 RuleType ruleType = RuleType::WHOLE_WORD)
接口功能:订阅规则构造函数,创建事件标签订阅规则对象。
输入参数:
- tag:订阅规则中指定的系统事件标签,字符串类型,最大长度16个字符(含),有效字符包含大小写字母及数字。
- ruleType:订阅规则的规则类型,RuleType枚举类型(参考表3)。
ListenerRule(const std::string& domain,
 const std::string& eventName,
 RuleType ruleType = RuleType::WHOLE_WORD)
接口功能:订阅规则构造函数,创建事件领域与事件名称订阅规则对象。
输入参数:
- domain:订阅规则中指定的系统事件领域,字符串类型,最大长度16个字符(含),有效字符包含大写字母、数字及下划线。
- eventName:订阅规则中指定的系统事件名称,字符串类型,最大长度32个字符(含),有效字符包含大写字母、数字及下划线。
- ruleType:订阅规则的规则类型,RuleType枚举类型(参考表3)。
ListenerRule(const std::string& domain,
 const std::string& eventName,
 const std::string& tag,
 RuleType ruleType = RuleType::WHOLE_WORD)
接口功能:订阅规则构造函数,创建事件领域、事件名称,事件标签订阅规则对象。
输入参数:
- domain:订阅规则中指定的系统事件领域,字符串类型,最大长度16个字符(含),有效字符包含大写字母、数字及下划线。
- eventName:订阅规则中指定的系统事件名称,字符串类型,最大长度32个字符(含),有效字符包含大写字母、数字及下划线。
- tag:订阅规则中指定的系统事件标签,字符串类型,最大长度16个字符(含),有效字符包含大小写字母及数字。
- ruleType:订阅规则的规则类型,RuleType枚举类型。

表3 HiSysEventListener订阅对象

接口名称描述
void HiSysEventListener::OnEvent(std::shared_ptr<HiSysEventRecord> sysEvent)接口功能:订阅事件的回调接口。
输入参数:
- sysEvent:订阅到的实时系统事件。
返回值:
无。
void HiSysEventListener::OnServiceDied()接口功能:服务异常回调。
输入参数:
无。
返回值:
无。

表4 HiSysEventRecord系统事件对象

接口名称描述
std::string HiSysEventRecord::AsJson()接口功能:获取该系统事件的内容。
输入参数:
无。
返回值:
该系统事件的内容。
std::string HiSysEventRecord::GetDomain()接口功能:获取该系统事件的域名。
输入参数:
无。
返回值:
该系统事件的域名。
std::string HiSysEventRecord::GetEventName()接口功能:获取该系统事件的名称。
输入参数:
无。
返回值:
该系统事件的名称。
HiSysEvent::EventType HiSysEventRecord::GetEventType()接口功能:获取该系统事件的类型。
输入参数:
无。
返回值:
该系统事件的类型。
std::string HiSysEventRecord::GetLevel()接口功能:获取该系统事件的级别。
输入参数:
无。
返回值:
该系统事件的级别。
std::string HiSysEventRecord::GetTag()接口功能:获取该系统事件的标签。
输入参数:
无。
返回值:
该系统事件的标签。
std::string HiSysEventRecord::GetTimeZone()接口功能:获取该系统事件的时区。
输入参数:
无。
返回值:
时区内容,格式为“+0800”。
int HiSysEventRecord::GetTraceFlag()接口功能:获取该系统事件的分布式跟踪标志位。
输入参数:
无。
返回值:
分布式跟踪标志位。
int64_t HiSysEventRecord::GetPid()接口功能:获取落盘该系统事件的进程ID。
输入参数:
无。
返回值:
进程ID。
int64_t HiSysEventRecord::GetTid()接口功能:获取落盘该系统事件的线程ID。
输入参数:
无。
返回值:
线程ID。
int64_t HiSysEventRecord::GetUid()接口功能:获取落盘该系统事件的用户ID。
输入参数:
无。
返回值:
用户ID。
uint64_t HiSysEventRecord::GetPspanId()接口功能:获取该系统事件的分布式跟踪父分支ID。
输入参数:
无。
返回值:
分布式跟踪父分支ID。
uint64_t HiSysEventRecord::GetSpandId()接口功能:获取该系统事件的分布式跟踪分支ID。
输入参数:
无。
返回值:
分布式跟踪分支ID。
uint64_t HiSysEventRecord::GetTime()接口功能:获取该系统事件的时间戳。
输入参数:
无。
返回值:
时间戳。
uint64_t HiSysEventRecord::GetTraceId()接口功能:获取该系统事件的分布式跟踪链ID。
输入参数:
无。
返回值:
分布式跟踪链ID。
void HiSysEventRecord::GetParamNames(std::vector<std::string>& params)接口功能:获取该系统事件的所有键名。
输入参数:
- params:键名数组引用。
返回值:
无。
int HiSysEventRecord::GetParamValue(const std::string& param, int64_t& value)接口功能:将该系统事件键名为param的值解析为int64_t类型的值。
输入参数:
- param:键名。
- value:int64_t类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成int64_t类型的值。
int HiSysEventRecord::GetParamValue(const std::string& param, uint64_t& value)接口功能:将该系统事件键名为param的值解析为uint64_t类型的值。
输入参数:
- param:键名。
- value:uint64_t类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成uint64_t类型的值。
int HiSysEventRecord::GetParamValue(const std::string& param, double& value)接口功能:将该系统事件键名为param的值解析为double类型的值。
输入参数:
- param:键名。
- value:double类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成double类型的值。
int HiSysEventRecord::GetParamValue(const std::string& param, std::string& value)接口功能:将该系统事件键名为param的值解析为string类型的值。
输入参数:
- param:键名。
- value:std::string类型引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成std::string类型的值。
int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<int64_t>& value)接口功能:将该系统事件键名为param的值解析为int64_t类型的数组。
输入参数:
- param:键名。
- value:int64_t类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成int64_t类型的数组。
int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<uint64_t>& value)接口功能:将该系统事件键名为param的值解析为uint64_t类型的数组。
输入参数:
- param:键名。
- value:uint64_t类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成uint64_t类型的数组。
int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<double>& value)接口功能:将该系统事件键名为param的值解析为double类型的数组。
输入参数:
- param:键名。
- value:double类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成double类型的数组。
int HiSysEventRecord::GetParamValue(const std::string& param, std::vector<std::string>& value)接口功能:将该系统事件键名为param的值解析为string类型的数组。
输入参数:
- param:键名。
- value:std::string类型数组引用。
返回值:
- 0:解析成功。
- -1:该系统事件初始化失败,无法解析。
- -2:不存在的键名。
- -3:类型不匹配,无法转换成std::string类型的数组。
C接口说明

C HiSysEvent订阅开发能力如下:具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。

icon-note.gif

说明:

HiSysEventWatcher订阅回调结构体OnEvent回调方法形参类型HiSysEventRecord请参考HiSysEvent查询中的“表11 HiSysEventRecord事件结构体”及“表12 HiSysEventRecord解析接口”说明。

表5 HiSysEvent订阅接口

接口名称描述
int OH_HiSysEvent_Add_Watcher(HiSysEventWatcher* watcher,
HiSysEventWatchRule rules[],
size_t ruleSize);
接口功能:添加对系统事件的订阅,通过设置规则订阅某些特定的事件。
输入参数:
- watcher:订阅回调对象。
- rules:事件订阅规则数组。
- ruleSize:事件订阅规则数组长度。
返回值:
- 0:订阅添加成功。
- 负值:订阅添加失败。
int OH_HiSysEvent_Remove_Watcher(HiSysEventWatcher* watcher);接口功能:移除对系统事件的订阅。
输入参数:
- watcher:订阅回调对象。
返回值:
- 0:订阅移除成功。
- 负值:订阅移除失败。

表6 HiSysEventWatcher订阅回调结构体

属性名称属性类型描述
OnEventvoid (*)(HiSysEventRecord record);接口功能:订阅事件的回调接口。
输入参数:
- record:订阅到的实时系统事件。
返回值:
无。
OnServiceDiedvoid (*)();接口功能:服务异常回调。
输入参数:
无。
返回值:
无。

表7 HiSysEventWatchRule订阅规则结构体

属性名称属性类型描述
domainchar[]用来指定订阅的系统事件领域。
namechar[]用来指定订阅的系统事件名称。
tagchar[]用来指定订阅的系统事件标签。
ruleTypeint用于指定订阅事件的匹配规则,取值请参考HiSysEvent查询中的“表4 RuleType匹配规则类型枚举”。
eventTypeint用于指定订阅事件的事件类型,取值请参考HiSysEvent查询中的“表3 EventType事件类型枚举”,当取值0,表示订阅所有的事件类型。

开发步骤

C++ HiSysEvent订阅开发步骤
  1. 引入对应的头文件。

    #include "hisysevent_manager.h"
    
  2. 业务领域实现对应的订阅回调接口。

    class TestListener : public OHOS::HiviewDFX::HiSysEventListener {
    public:
        void OnEvent(std::shared_ptr<HiSysEventRecord> record)
        {
            if (record == nullptr) {
                return;
            }
            std::cout << record->AsJson() << std::endl;
        }
    
        void OnServiceDied()
        {
            std::cout << std::string("service disconnect, exit") << std::endl;
            exit(0);
        }
    };
    
  3. 在订阅事件的地方调用订阅接口,并传入相应的订阅回调参数、订阅规则列表,在业务结束,注销此次订阅。

    auto testListener = std::make_shared<TestListener>();
    // 事件标签规则订阅,规则类型为默认的全词匹配类型
    ListenerRule tagRule("dfx");
    // 事件标签规则订阅,规则类型为正则匹配类型
    ListenerRule regRule("dfx.*", RuleType::REGULAR);
    // 事件领域及事件名称规则订阅,规则类型为前缀匹配类型
    ListenerRule domainNameRule("HIVIEWDFX", "APP_USAGE", RuleType::PREFIX);
    std::vector<ListenerRule> sysRules;
    sysRules.push_back(tagRule);
    sysRules.push_back(regRule);
    sysRules.push_back(domainNameRule);
    // 开始系统事件订阅
    auto ret = HiSysEventManager::AddListener(testListener, sysRules);
    // 订阅结束,移除订阅回调参数。
    if (ret == 0) {
       HiSysEventManager::RemoveListener(testListener);
    }
    
C HiSysEvent订阅开发步骤
  1. 引入对应的头文件。

    #include "hisysevent_manager_c.h"
    
  2. 业务领域实现对应的订阅回调接口。

    void OnEventTest(HiSysEventRecord record)
    {
        printf("OnEventTest: event=%s", record.jsonStr);
    }
    
    void OnServiceDiedTest()
    {
        printf("OnServiceDied");
    }
    
  3. 在订阅事件的地方调用订阅接口,并传入相应的订阅回调参数、订阅规则列表,在业务结束,注销此次订阅。

    HiSysEventWatcher watcher;
    watcher.OnEvent = OnEventTest;
    watcher.OnServiceDied = OnServiceDiedTest;
    // 事件标签规则订阅,规则类型为默认的全词匹配类型
    constexpr char DFX_TAG[] = "dfx";
    HiSysEventWatchRule tagRule;
    (void)strcpy_s(tagRule.tag, strlen(DFX_TAG) + 1, DFX_TAG);
    tagRule.ruleType = 1;
    tagRule.eventType = 0;
    // 事件标签规则订阅,规则类型为正则匹配类型
    constexpr char DFX_PATTERN_TAG[] = "dfx.*";
    HiSysEventWatchRule regRule;
    (void)strcpy_s(regRule.tag, strlen(DFX_PATTERN_TAG) + 1, DFX_PATTERN_TAG);
    regRule.ruleType = 3;
    regRule.eventType = 0;
    // 事件领域及事件名称规则订阅,规则类型为前缀匹配类型
    constexpr char DOMAIN[] = "HIVIEWDFX";
    constexpr char NAME[] = "APP_USAGE";
    HiSysEventWatchRule domainNameRule;
    (void)strcpy_s(domainNameRule.domain, strlen(DOMAIN) + 1, DOMAIN);
    (void)strcpy_s(domainNameRule.name, strlen(NAME) + 1, NAME);
    domainNameRule.ruleType = 2;
    domainNameRule.eventType = 0;
    // 开始系统事件订阅
    HiSysEventWatchRule rules[] = {tagRule, regRule, domainNameRule};
    int ret = OH_HiSysEvent_Add_Watcher(&watcher, rules, sizeof(rules) / sizeof(HiSysEventWatchRule));
    // 订阅结束,移除订阅回调参数。
    if (ret == 0) {
        ret = OH_HiSysEvent_Remove_Watcher(&watcher);
    }
    

开发实例

C++ HiSysEvent订阅开发实例

假设业务模块需要订阅事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

  1. 在业务模块的在BUILD.gn里增加hisysevent部件的libhisysevent及libhisyseventmanager依赖。

    external_deps = [
      "hisysevent:libhisysevent",
      "hisysevent:libhisyseventmanager",
    ]
    
  2. 在业务模块的TestEventListening()函数中,调用订阅接口去订阅事件,业务结束时移除事件订阅。

    #include <iostream>
    
    #include "hisysevent_manager.h"
    
    using namespace OHOS::HiviewDFX;
    
    class TestListener : public HiSysEventQueryCallback {
    public:
        void OnEvent(std::shared_ptr<HiSysEventRecord> record)
        {
            if (record == nullptr) {
                return;
            }
            std::cout << record->AsJson() << std::endl;
        }
    
        void OnServiceDied()
        {
            std::cout << std::string("service disconnect, exit") << std::endl;
            exit(0);
        }
    };
    
    void TestEventListening()
    {
        auto testListener = std::make_shared<TestListener>();
        ListenerRule domainNameRule("HIVIEWDFX", "PLUGIN_LOAD", RuleType::WHOLE_WORD);
        std::vector<ListenerRule> sysRules;
        sysRules.push_back(domainNameRule);
        auto ret = HiSysEventManager::AddListener(testListener, sysRules);
        if (ret == 0) {
            HiSysEventManager::RemoveListener(testListener);
        }
    }
    
C HiSysEvent订阅开发实例

假设业务模块需要订阅事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

  1. 在业务模块的在BUILD.gn里增加hisysevent部件的libhisysevent及libhisyseventmanager依赖。

    external_deps = [ "hisysevent:libhisyseventmanager" ]
    
    // for strcpy_s
    deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
    
  2. 在业务模块的TestEventListening()函数中,调用订阅接口去订阅事件,业务结束时移除事件订阅。

    #include <securec.h>
    
    #include "hisysevent_manager_c.h"
    
    void OnEventTest(HiSysEventRecord record)
    {
        printf("OnEventTest: event=%s", record.jsonStr);
    }
    
    void OnServiceDiedTest()
    {
        printf("OnServiceDied");
    }
    
    void TestEventListening()
    {
        HiSysEventWatcher watcher;
        watcher.OnEvent = OnEventTest;
        watcher.OnServiceDied = OnServiceDiedTest;
        constexpr char DOMAIN[] = "HIVIEWDFX";
        constexpr char NAME[] = "PLUGIN_LOAD";
        HiSysEventWatchRule domainNameRule;
        (void)strcpy_s(domainNameRule.domain, strlen(DOMAIN) + 1, DOMAIN);
        (void)strcpy_s(domainNameRule.name, strlen(NAME) + 1, NAME);
        domainNameRule.ruleType = 1;
        domainNameRule.eventType = 0;
        HiSysEventWatchRule rules[] = {domainNameRule};
        int ret = OH_HiSysEvent_Add_Watcher(&watcher, rules, sizeof(rules) / sizeof(HiSysEventWatchRule));
        if (ret == 0) {
           ret = OH_HiSysEvent_Remove_Watcher(&watcher);
       }
    }
    

五、HiSysEvent查询

概述

HiSysEvent提供了查询接口,支持开发者设置条件查询HiSysEvent事件,例如功耗部件可以通过该接口获取所需的系统事件进行业务分析。

开发指导

接口说明

C++接口说明

C++ HiSysEvent查询开发能力如下:HiSysEventManager类,具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。

icon-note.gif

说明:

HiSysEventQueryCallback查询回调对象OnQuery方法中的形参类型HiSysEventRecord请参考HiSysEvent订阅中的“表4 HiSysEventRecord系统事件对象”说明。

表1 HiSysEvent查询接口

接口名称描述
int32_t Query(struct QueryArg& arg,
std::vector<QueryRule>& rules,
std::shared_ptr<HiSysEventQueryCallback> callback)
接口功能:支持根据时间段、事件领域、事件名称等条件,查询满足条件的HiSysEvent事件。
输入参数:
- arg:查询参数。
- rules:事件过滤规则。
- callback:查询接口回调对象。
返回值:
- 0:查询成功。
- 负值:查询失败。

表2 QueryArg查询参数对象

属性名称属性类型描述
beginTimelong long用于指定查询事件的开始时间,格式为Unix毫秒级时间戳。
endTimelong long用于指定查询事件的结束时间,格式为Unix毫秒级时间戳。
maxEventsint用于指定查询返回事件的最多条数。

表3 EventType事件类型枚举

事件类型描述
FAULT1故障类型。
STATISTIC2统计类型。
SECURITY3安全类型。
BEHAVIOR4用户行为类型。

表4 RuleType匹配规则类型枚举

查询规则类型描述
WHOLE_WORD1全词匹配类型。
PREFIX2前缀匹配类型。
REGULAR3正则匹配类型。

表5 QueryRule查询规则对象

接口名称描述
QueryRule(const std::string& domain,
const std::vector<std::string>& eventList,
RuleType ruleType,
uint32_t eventType,
const std::string& cond)
接口功能:查询规则构造函数,创建查询规则对象。
输入参数:
- domain:string类型,用来标识查询规则对象的事件所属领域,如果传入的是空字符串,则默认事件领域字段匹配成功。
- eventList:std::vector<std::string>类型,事件名称的列表,如果传入的是空字符串,则默认事件名称字段匹配成功。
- ruleType:RuleType类型,请参考表4。
- eventType:uint32_t类型,查询的系统事件类型,系统事件类型请参考表3,当eventType取值为0时,表示查询所有事件类型。
- cond:string类型,设置的系统事件查询条件。

对于condition参数需要按照指定的JSON字符串格式传入,使用实例如下:

```json
{
    "version":"V1",
    "condition":{
        "and":[
            {"param":"type_","op":">","value":0},
            {"param":"uid_","op":"=","value":1201}
        ]
    }
}
```
  • version字段是必选字段,表示传入条件的支持版本,当前只支持V1版本。
  • condition字段是必选字段,表示传入条件的具体内容。
    • and字段是可选字段,表示条件之间是与的关系。
      • param字段是必选字段,表示条件匹配的参数名称,必须为字符串类型。
      • op字段是必选字段,表示条件匹配的参数比较符,必须为字符串类型,支持的比较符包括=、>、<、>=、<=。
      • value字段是必选字段,表示条件匹配的参数值,必须为字符串类型或整型。

表6 HiSysEventQueryCallback查询回调对象

接口名称描述
void HiSysEventQueryCallback::OnQuery(std::shared_ptr<std::vector<HiSysEventRecord>> sysEvents)接口功能:事件查询的回调。
输入参数:
- sysEvents:返回的事件集合。
void HiSysEventQueryCallback::OnComplete(int32_t reason, int32_t total)接口功能:事件查询完成的回调。
输入参数:
- reason:查询结束的返回原因,0表示查询正常结束,其他值表示查询异常结束。
- total:本次查询返回的事件的总数量。
C接口说明

C HiSysEvent查询开发能力如下:具体API详见接口目录(/base/hiviewdfx/hisysevent/interfaces/native/innerkits/hisysevent_manager/include/)。

表7 HiSysEvent查询接口

接口名称描述
int OH_HiSysEvent_Query(const HiSysEventQueryArg& arg, HiSysEventQueryRule rules[], size_t ruleSize, HiSysEventQueryCallback& callback);接口功能:支持根据时间段、事件领域、事件名称、事件参数等条件,查询满足条件的HiSysEvent事件。
输入参数:
- arg:查询参数。
- rules:事件过滤规则。
- ruleSize:事件过滤规则数量。
- callback:查询接口回调。
返回值:
- 0:查询成功。
- 负值:查询失败。

表8 HiSysEventQueryArg查询参数结构体

属性名称属性类型描述
beginTimeint64_t用于指定查询事件的开始时间,格式为Unix毫秒级时间戳。
endTimeint64_t用于指定查询事件的结束时间,格式为Unix毫秒级时间戳。
maxEventsint32_t用于指定查询返回事件的最多条数。

表9 HiSysEventQueryRule查询规则结构体

属性名称属性类型描述
domainchar[]用来指定查询的事件领域。
eventListchar[][]用于指定查询的事件名称列表。
eventListSizesize_t用于指定查询的事件名称列表大小。
conditionchar*用于指定查询的自定义事件参数条件。

表10 HiSysEventQueryCallback查询回调结构体

属性名称属性类型描述
OnQueryvoid (*)(HiSysEventRecord records[], size_t size);接口功能:事件查询的回调。
输入参数:
- records:返回的事件集合。
- size:返回的事件集合大小。
OnCompletevoid (*)(int32_t reason, int32_t total);接口功能:事件查询完成的回调。
输入参数:
- reason:查询结束的返回原因,0表示查询正常结束,其他值表示查询异常结束。
- total:本次查询返回的事件的总数量。

表11 HiSysEventRecord事件结构体

属性名称属性类型描述
domainchar[]事件的领域名称。
eventNamechar[]事件的名称。
typeHiSysEventEventType事件的类型。
timeuint64_t事件的时间戳。
tzchar[]事件的时区。
pidint64_t事件的进程ID。
tidint64_t事件的线程ID。
uidint64_t事件的用户ID。
traceIduint64_t事件的分布式跟踪链ID。
spandIduint64_t事件的分布式跟踪分支ID。
pspanIduint64_t事件的分布式跟踪父分支ID。
traceFlagint事件的分布式跟踪标志位。
levelchar*事件的级别。
tagchar*事件的标签。
jsonStrchar*事件的内容。

表12 HiSysEventRecord解析接口

接口名称
void OH_HiSysEvent_GetParamNames(const HiSysEventRecord& record, char*** params, size_t& len);接口功能:获取该事件的所有的参数名。
输入参数:
- record:事件结构体。
- params:参数名数组。
- len:数组大小。
int OH_HiSysEvent_GetParamInt64Value(const HiSysEventRecord& record, const char* name, int64_t& value);接口功能:将该事件中参数名为name的参数值,解析为int64_t类型并赋值到value。
输入参数:
- record:事件结构体。
- name:参数名。
- value:int64_t类型的参数值。
int OH_HiSysEvent_GetParamUint64Value(const HiSysEventRecord& record, const char* name, uint64_t& value);接口功能:将该事件中参数名为name的参数值,解析为uint64_t类型并赋值到value。
输入参数:
- record:事件结构体。
- name:参数名。
- value:uint64_t类型的参数值。
int OH_HiSysEvent_GetParamDoubleValue(const HiSysEventRecord& record, const char* name, double& value);接口功能:将该事件中参数名为name的参数值,解析为double类型并赋值到value。
输入参数:
- record:事件结构体。
- name:参数名。
- value:double类型的参数值。
int OH_HiSysEvent_GetParamStringValue(const HiSysEventRecord& record, const char* name, char** value);接口功能:将该事件中参数名为name的参数值,解析为char数组类型并赋值到value,value在使用完成后需要手动释放内存。
输入参数:
- record:事件结构体。
- name:参数名。
- value:char*类型引用。
int OH_HiSysEvent_GetParamInt64Values(const HiSysEventRecord& record, const char* name, int64_t** value, size_t& len);接口功能:将该事件中参数名为name的参数值,解析为int64_t数组类型并赋值到value,value在使用完成后需要手动释放内存。
输入参数:
- record:事件结构体。
- name:参数名。
- value:int64_t*类型引用。
- len:数组大小。
int OH_HiSysEvent_GetParamUint64Values(const HiSysEventRecord& record, const char* name, uint64_t** value, size_t& len);接口功能:将该事件中参数名为name的参数值,解析为uint64_t数组类型并赋值到value,value在使用完成后需要手动释放内存。
输入参数:
- record:事件结构体。
- name:参数名。
- value:uint64_t*类型引用。
- len:数组大小。
int OH_HiSysEvent_GetParamDoubleValues(const HiSysEventRecord& record, const char* name, double** value, size_t& len);接口功能:将该事件中参数名为name的参数值,解析为double数组类型并赋值到value,value在使用完成后需要手动释放内存。
输入参数:
- record:事件结构体。
- name:参数名。
- value:double*类型引用。
- len:数组大小。
int OH_HiSysEvent_GetParamStringValues(const HiSysEventRecord& record, const char* name, char*** value, size_t& len);接口功能:将该事件中参数名为name的参数值,解析为char*数组类型并赋值到value,value在使用完成后需要手动释放内存。
输入参数:
- record:事件结构体。
- name:参数名。
- value:char**类型引用。
- len:数组大小。

HiSysEventRecord解析接口的返回值说明如下:

  • 0,表示解析成功;
  • -1,表示该事件初始化失败;
  • -2,表示参数名不存在;
  • -3,表示要解析的参数值类型与传入的参数值类型不匹配。

开发步骤

C++ HiSysEvent查询开发步骤
  1. 引入对应的头文件。

    #include "hisysevent_manager.h"
    
  2. 业务领域实现对应的查询回调接口。

    class TestQueryCallback : public HiSysEventQueryCallback {
    public:
        void OnQuery(std::shared_ptr<std::vector<HiSysEventRecord>> sysEvents) override
        {
            if (sysEvents == nullptr) {
                return;
            }
            for_each((*sysEvents).cbegin(), (*sysEvents).cend(), [](const HiSysEventRecord& event) {
                std::cout << event.AsJson() << std::endl;
            });
        }
    
        void OnComplete(int32_t reason, int32_t total) override
        {
            std::cout << "Query completed" << std::endl;
            return;
        }
    };
    
  3. 在查询的地方调用查询接口,并传入相应的查询参数、查询规则、查询回调参数。

    // 创建查询参数对象
    long long startTime = 0;
    long long endTime = 1668245644000; //2022-11-12 09:34:04
    int queryCount = 10;
    QueryArg arg(startTime, endTime, queryCount);
    
    // 创建查询规则对象
    QueryRule rule("HIVIEWDFX", { "PLUGIN_LOAD" });
    std::vector<QueryRule> queryRules = { rule };
    
    // 创建查询回调对象
    auto queryCallback = std::make_shared<TestQueryCallback>();
    
    // 调用查询接口
    HiSysEventManager::Query(arg, queryRules, queryCallback);
    
C HiSysEvent查询开发步骤
  1. 引入对应的头文件。

    #include "hisysevent_manager_c.h"
    
  2. 业务领域实现对应的查询回调接口。

    void OnQueryTest(HiSysEventRecord records[], size_t size)
    {
        for (size_t i = 0; i < size; i++) {
            printf("OnQuery: event=%s", records[i].jsonStr);
        }
    }
    
    void OnCompleteTest(int32_t reason, int32_t total)
    {
        printf("OnCompleted, res=%d, total=%d\n", reason, total);
    }
    
  3. 在查询的地方调用查询接口,并传入相应的查询参数、查询规则、查询回调参数。

    // 创建查询参数对象
    HiSysEventQueryArg arg;
    arg.beginTime = 0;
    arg.endTime = 1668245644000; //2022-11-12 09:34:04
    arg.maxEvents = 10;
    
    // 创建查询规则对象
    constexpr char TEST_DOMAIN[] = "HIVIEWDFX";
    constexpr char TEST_NAME[] = "PLUGIN_LOAD";
    HiSysEventQueryRule rule;
    (void)strcpy_s(rule.domain, strlen(TEST_DOMAIN) + 1, TEST_DOMAIN);
    (void)strcpy_s(rule.eventList[0], strlen(TEST_NAME) + 1, TEST_NAME);
    rule.eventListSize = 1;
    rule.condition = nullptr;
    HiSysEventQueryRule rules[] = { rule };
    
    // 创建查询回调对象
    HiSysEventQueryCallback callback;
    callback.OnQuery = OnQueryTest;
    callback.OnComplete = OnCompleteTest;
    
    // 调用查询接口
    OH_HiSysEvent_Query(arg, rules, sizeof(rules) / sizeof(HiSysEventQueryRule), callback);
    

开发实例

C++ HiSysEvent查询开发实例

假设业务模块需要查询截止至当前时间、事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

  1. 在业务模块的在BUILD.gn里增加hisysevent部件的libhisysevent及libhisyseventmanager依赖。

    external_deps = [
      "hisysevent:libhisysevent",
      "hisysevent:libhisyseventmanager",
    ]
    
  2. 在业务模块的TestQuery()函数中,调用查询接口去查询事件。

    #include "hisysevent_manager.h"
    #include <iostream>
    #include <unistd.h>
    
    using namespace OHOS::HiviewDFX;
    
    class TestQueryCallback : public HiSysEventQueryCallback {
    public:
        void OnQuery(std::shared_ptr<std::vector<HiSysEventRecord>> sysEvents) override
        {
            if (sysEvents == nullptr) {
                return;
            }
            for_each((*sysEvents).cbegin(), (*sysEvents).cend(), [](const HiSysEventRecord& event) {
                std::cout << event.AsJson() << std::endl;
            });
        }
    
        void OnComplete(int32_t reason, int32_t total) override
        {
            std::cout << "Query completed" << std::endl;
            return;
        }
    };
    
    int64_t GetMilliseconds()
    {
        auto now = std::chrono::system_clock::now();
        auto millisecs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
        return millisecs.count();
    }
    
    void TestQuery()
    {
        long long startTime = 0;
        long long endTime = GetMilliseconds();
        int maxEvents = 100;
        QueryArg arg(startTime, endTime, maxEvents);
        QueryRule rule("HIVIEWDFX", { "PLUGIN_LOAD" });
        std::vector<QueryRule> queryRules = { rule };
        auto queryCallback = std::make_shared<TestQueryCallback>();
        int ret = HiSysEventManager::Query(arg, queryRules, queryCallback);
    }
    
C HiSysEvent查询开发实例

假设业务模块需要查询截止至当前时间、事件领域为HIVIEWDFX、事件名称为PLUGIN_LOAD的所有事件,其完整使用示例如下所示:

  1. 在业务模块的在BUILD.gn里增加hisysevent部件的libhisyseventmanager依赖。
    external_deps = [ "hisysevent:libhisyseventmanager" ]

    // for strcpy_s
    deps = [ "//third_party/bounds_checking_function:libsec_shared" ]
  1. 在业务模块的TestQuery()函数中,调用查询接口去查询事件。

    #include "hisysevent_manager_c.h"
    #include <securec.h>
    #include <time.h>
     
    void OnQueryTest(HiSysEventRecord records[], size_t size)
    {
        for (size_t i = 0; i < size; i++) {
            printf("OnQuery: event=%s", records[i].jsonStr);
        }
    }
    
    void OnCompleteTest(int32_t reason, int32_t total)
    {
        printf("OnCompleted, res=%d, total=%d\n", reason, total);
    }
    
    int64_t GetMilliseconds()
    {
        return time(NULL);
    }
    
    void TestQuery()
    {
        HiSysEventQueryArg arg;
        arg.beginTime = 0;
        arg.endTime = GetMilliseconds();
        arg.maxEvents = 100;
        constexpr char TEST_DOMAIN[] = "HIVIEWDFX";
        constexpr char TEST_NAME[] = "PLUGIN_LOAD";
        HiSysEventQueryRule rule;
        (void)strcpy_s(rule.domain, strlen(TEST_DOMAIN) + 1, TEST_DOMAIN);
        (void)strcpy_s(rule.eventList[0], strlen(TEST_NAME) + 1, TEST_NAME);
        rule.eventListSize = 1;
        rule.condition = nullptr;
        HiSysEventQueryRule rules[] = { rule };
        HiSysEventQueryCallback callback;
        callback.OnQuery = OnQueryTest;
        callback.OnComplete = OnCompleteTest;
        int ret = OH_HiSysEvent_Query(arg, rules, sizeof(rules) / sizeof(HiSysEventQueryRule), callback);
    }
    

六、HiSysEvent工具

概述

目前在系统的/system/bin目录下预置了hisysevent工具,开发者可以通过此工具实时订阅HiSysEvent事件及查询历史HiSysEvent事件。

实时订阅HiSysEvent事件相关命令

  • 实时订阅HiSysEvent事件的基础命令:

    hisysevent -r
    

    选项说明:

    选项名称功能说明
    -r以缺省设置实时订阅HiSysEvent事件,在此种订阅方式下有任何实时HiSysEvent事件产生,都会在控制台上打印此HiSysEvent事件。
  • 通过事件标签方式实时订阅HiSysEvent事件:

    hisysevent -r -t <tag> [-c [WHOLE_WORD|PREFIX|REGULAR]]
    

    选项说明:

    选项名称功能说明
    -t设置实时订阅的HiSysEvent事件标签,用来过滤订阅的HiSysEvent事件。
    -c设置实时订阅的HiSysEvent事件标签匹配规则,有“WHOLE_WORD”、“PREFIX”、“REGULAR”三种匹配规则。

    命令实例:

    # hisysevent -r -t "STA" -c PREFIX
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963670809,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805200750","HAPPEN_TIME":1501963670809,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"4973863135535405472","info_":""}
    # hisysevent -r -t "STAw{0,6}" -c REGULAR
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963793206,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805200953","HAPPEN_TIME":1501963793206,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"16367997008075110557","info_":""}
    # hisysevent -r -t "STA\w+" -c REGULAR
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963863393,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201103","HAPPEN_TIME":1501963863393,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"5522352691813553392","info_":""}
    
  • 通过事件领域及事件名称的方式实时订阅HiSysEvent事件:

    hisysevent -r -o <domain> -n <eventName> [-c [WHOLE_WORD|PREFIX|REGULAR]]
    

    选项说明:

    选项名称功能说明
    -o设置实时订阅的HiSysEvent事件领域,用来过滤订阅的HiSysEvent事件。
    -n设置实时订阅的HiSysEvent事件名称,用来过滤订阅的HiSysEvent事件。
    -c设置实时订阅的HiSysEvent事件领域及事件名称的匹配规则,有“WHOLE_WORD”、“PREFIX”、“REGULAR”三种匹配规则。

    命令实例:

    # hisysevent -r -o "RELIABILITY" -n "APP_FREEZE"
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963989773,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201309","HAPPEN_TIME":1501963989773,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"16367997008075110557","info_":""}
    # hisysevent -r -o "RELIABI\w{0,8}" -n "APP_FREEZE" -c REGULAR
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501964144383,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201544","HAPPEN_TIME":1501964144383,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"13456525196455104060","info_":""}
    # hisysevent -r -o "RELIABI\w+" -c REGULAR
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501964193466,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201633","HAPPEN_TIME":1501964193466,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"12675246910904037271","info_":""}
    

    icon-note.gif

    说明: 当同时通过-t、-o及-n指定了相关订阅规则参数设置,则判断设置的事件标签是否为空,若不为空,则使用事件标签规则进行订阅,否则使用事件领域及事件名称订阅规则进行订阅。

  • 通过事件类型的方式实时订阅HiSysEvent事件:

    hisysevent -r -g [FAULT|STATISTIC|SECURITY|BEHAVIOR]
    

    选项说明:

    选项名称功能说明
    -g设置实时订阅的HiSysEvent事件类型,用来过滤订阅的HiSysEvent事件,有“FAULT”、“STATISTIC”、“SECURITY”及“BEHAVIOR”四种事件类型。

    命令实例:

    # hisysevent -r -o "RELIABILITY" -n "APP_FREEZE" -g FAULT
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963989773,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201309","HAPPEN_TIME":1501963989773,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"16367997008075110557","info_":""}
    # hisysevent -r -o "POWER\w{0,8}" -n "POWER_RUNNINGLOCK" -c REGULAR -g STATISTIC
    {"domain_":"POWER","name_":"POWER_RUNNINGLOCK","type_":2,"time_":1667485283785,"tz_":"+0000","pid_":538,"tid_":684,"uid_":5523,"PID":360,"UID":1001,"STATE":0,"TYPE":1,"NAME":"telRilRequestRunningLock","LOG_LEVEL":2,"TAG":"DUBAI_TAG_RUNNINGLOCK_REMOVE","MESSAGE":"token=25956496","level_":"MINOR","tag_":"PowerStats","id_":"11994072552538324655","info_":""}
    # hisysevent -r -o "ACCOU\w+" -c REGULAR -g SECURITY
    {"domain_":"ACCOUNT","name_":"PERMISSION_EXCEPTION","type_":3,"time_":1667484405993,"tz_":"+0000","pid_":614,"tid_":614,"uid_":3058,"CALLER_UID":1024,"CALLER_PID":523,"PERMISSION_NAME":"ohos.permission.MANAGE_LOCAL_ACCOUNTS","level_":"CRITICAL","tag_":"security","id_":"15077995598140341422","info_":""}
    # hisysevent -r -o MULTIMODALINPUT -g BEHAVIOR
    {"domain_":"MULTIMODALINPUT","name_":"Z_ORDER_WINDOW_CHANGE","type_":4,"time_":1667549852735,"tz_":"+0000","pid_":2577,"tid_":2588,"uid_":6696,"OLD_ZORDER_FIRST_WINDOWID":-1,"NEW_ZORDER_FIRST_WINDOWID":2,"OLD_ZORDER_FIRST_WINDOWPID":-1,"NEW_ZORDER_FIRST_WINDOWPID":1458,"MSG":"The ZorderFirstWindow changing succeeded","level_":"MINOR","tag_":"PowerStats","id_":"16847308118559691400","info_":""}
    

查询历史HiSysEvent事件相关命令

  • 查询历史HiSysEvent事件的基础命令:

    hisysevent -l
    

    选项说明:

    选项名称功能说明
    -l以缺省设置查询历史HiSysEvent事件,此次查询会返回不多于10000条的HiSysEvent事件。
  • 通过设置开始/结束原始时间戳,过滤查询历史HiSysEvent事件的结果的命令:

    hisysevent -l -s <begin time> -e <end time>
    

    选项说明:

    选项名称功能说明
    -s设置查询历史HiSysEvent事件的开始原始时间戳,此次查询只会返回不早于该时间点的HiSysEvent事件。
    -e设置查询历史HiSysEvent事件的结束原始时间戳,此次查询只会返回不晚于该时间点的HiSysEvent事件。

    命令实例:

    # hisysevent -l -s 1501964222980 -e 1501964222996
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501964222980,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201702","HAPPEN_TIME":1501964222980,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"10435592800188571430","info_":""}
    {"domain_":"GRAPHIC","name_":"NO_DRAW","type_":1,"time_":1501964222980,"tz_":"+0000","pid_":1505,"tid_":1585,"uid_":10002,"PID":1505,"UID":10002,"ABILITY_NAME":"","MSG":"It took 1957104259905ns to draw, UI took 0ns to draw, RSRenderThread took 8962625ns to draw, RSRenderThread dropped 0 UI Frames","level_":"MINOR","id_":"1708287249901948387","info_":"isResolved,eventId:0"}
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501964222994,"tz_":"+0000","pid_":623,"tid_":1445,"uid_":1201,"SUB_EVENT_TYPE":"NO_DRAW","EVENT_TIME":"20170805201702","MODULE":"NO_DRAW","PNAME":"NO_DRAW","REASON":"NO_DRAW","DIAG_INFO":"","STACK":"SUMMARY:\n","HIVIEW_LOG_FILE_PATHS":["/data/log/faultlog/faultlogger/appfreeze-NO_DRAW-10002-20170805201702"],"DOMAIN":"GRAPHIC","STRING_ID":"NO_DRAW","PID":1505,"UID":10002,"PACKAGE_NAME":"NO_DRAW","PROCESS_NAME":"","MSG":"It took 1956945826265ns to draw, UI took 0ns to draw, RSRenderThread took 9863293ns to draw, RSRenderThread dropped 0 UI Frames\n","level_":"CRITICAL","tag_":"STABILITY","id_":"10448522101019619655","info_":""}
    
  • 通过设置开始/结束格式化时间,过滤查询历史HiSysEvent事件的结果的命令:

    hisysevent -l -S <begin time> -E <end time>
    

    选项说明:

    选项名称功能说明
    -S设置查询历史HiSysEvent事件的开始格式化时间,此次查询只会返回不早于该时间点的HiSysEvent事件。
    -E设置查询历史HiSysEvent事件的结束格式化时间,此次查询只会返回不晚于该时间点的HiSysEvent事件。

    命令实例:

    # hisysevent -l -S "2023-01-05 14:12:50" -E "2023-01-05 14:12:51"
    {"domain_":"GRAPHIC","name_":"JANK_FRAME_SKIP","type_":1,"time_":1672899170022,"tz_":"+0800","pid_":1499,"tid_":1573,"uid_":20010037,"PID":1499,"UID":20010037,"ABILITY_NAME":"com.ohos.launcher","MSG":"It took 587948726ns to draw, UI took 483016382ns to draw, RSRenderThread took 96616051ns to draw, RSRenderThread dropped 0 UI Frames","level_":"MINOR","id_":"11351278822867091090","info_":"","seq_":307}
    {"domain_":"AAFWK","name_":"START_ABILITY_ERROR","type_":1,"time_":1672899170108,"tz_":"+0800","pid_":550,"tid_":1127,"uid_":5523,"USER_ID":-1,"BUNDLE_NAME":"com.ohos.wallpaper","MODULE_NAME":"","ABILITY_NAME":"WallpaperExtAbility","ERROR_CODE":2097152,"level_":"MINOR","tag_":"ability","id_":"53589395004188308060","info_":"","seq_":313}
    {"domain_":"GRAPHIC","name_":"JANK_FRAME_SKIP","type_":1,"time_":1672899170305,"tz_":"+0800","pid_":1293,"tid_":1632,"uid_":10006,"PID":1293,"UID":10006,"ABILITY_NAME":"com.ohos.systemui","MSG":"It took 309597490ns to draw, UI took 92364718ns to draw, RSRenderThread took 205874105ns to draw, RSRenderThread dropped 1 UI Frames","level_":"MINOR","id_":"14843220972178010722","info_":"","seq_":314}
    {"domain_":"GRAPHIC","name_":"JANK_FRAME_SKIP","type_":1,"time_":1672899170350,"tz_":"+0800","pid_":1293,"tid_":1632,"uid_":10006,"PID":1293,"UID":10006,"ABILITY_NAME":"com.ohos.systemui","MSG":"It took 259782859ns to draw, UI took 33909753ns to draw, RSRenderThread took 44849879ns to draw, RSRenderThread dropped 5 UI Frames","level_":"MINOR","id_":"66610006717219916560","info_":"","seq_":315}
    {"domain_":"AAFWK","name_":"CONNECT_SERVICE_ERROR","type_":1,"time_":1672899170733,"tz_":"+0800","pid_":550,"tid_":1127,"uid_":5523,"USER_ID":100,"BUNDLE_NAME":"com.ohos.wallpaper","MODULE_NAME":"","ABILITY_NAME":"WallpaperExtAbility","ERROR_CODE":2097152,"level_":"MINOR","tag_":"ability","id_":"10040008376311927188","info_":"","seq_":317}
    {"domain_":"COMMONEVENT","name_":"PUBLISH","type_":2,"time_":1672899170063,"tz_":"+0800","pid_":550,"tid_":937,"uid_":5523,"USER_ID":-1,"PUBLISHER_BUNDLE_NAME":"","PID":0,"UID":1101,"EVENT_NAME":"usual.event.SCREEN_ON","level_":"MINOR","id_":"80996758983032931610","info_":"","seq_":308}
    
  • 通过设置最大数量值,限制查询历史HiSysEvent事件的数量:

    hisysevent -l -m <max hisysevent count>
    

    选项说明:

    选项名称功能说明
    -m设置查询历史HiSysEvent事件的数量,此次查询会返回最多不超过指定数量的HiSysEvent事件。

    命令实例:

    # hisysevent -l -s 1501964222980 -e 1501964222996 -m 1
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501964222980,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201702","HAPPEN_TIME":1501964222980,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"10435592800188571430","info_":""}
    
  • 通过事件领域及事件名称的方式查询历史HiSysEvent事件:

    hisysevent -l -o <domain> -n <eventName> [-c WHOLE_WORD]
    

    选项说明:

    选项名称功能说明
    -o设置查询历史HiSysEvent事件领域,用来过滤查询的HiSysEvent事件。
    -n设置查询历史HiSysEvent事件名称,用来过滤查询的HiSysEvent事件。
    -c设置查询历史HiSysEvent事件领域及事件名称的匹配规则,查询只支持“WHOLE_WORD”匹配规则。

    命令实例:

    # hisysevent -l -n "APP_FREEZE"
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963989773,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201309","HAPPEN_TIME":1501963989773,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"16367997008075110557","info_":""}
    # hisysevent -l -o "RELIABILITY"
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963989773,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201544","HAPPEN_TIME":1501963989773,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"13456525196455104060","info_":""}
    # hisysevent -l -o "RELIABILITY" -n "APP_FREEZE" -c WHOLE_WORD
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963989773,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201633","HAPPEN_TIME":1501963989773,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"12675246910904037271","info_":""}
    
  • 通过事件类型的方式查询历史HiSysEvent事件:

    hisysevent -l -g [FAULT|STATISTIC|SECURITY|BEHAVIOR]
    

    选项说明:

    选项名称功能说明
    -g设置查询历史HiSysEvent事件类型,用来过滤查询的HiSysEvent事件,有“FAULT”、“STATISTIC”、“SECURITY”及“BEHAVIOR”四种事件类型。

    命令实例:

    # hisysevent -l -o "RELIABILITY" -g FAULT
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501963989773,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201309","HAPPEN_TIME":1501963989773,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"16367997008075110557","info_":""}
    # hisysevent -l -n "POWER_RUNNINGLOCK" -c WHOLE_WORD -g STATISTIC
    {"domain_":"POWER","name_":"POWER_RUNNINGLOCK","type_":2,"time_":1667485283785,"tz_":"+0000","pid_":538,"tid_":684,"uid_":5523,"PID":360,"UID":1001,"STATE":0,"TYPE":1,"NAME":"telRilRequestRunningLock","LOG_LEVEL":2,"TAG":"DUBAI_TAG_RUNNINGLOCK_REMOVE","MESSAGE":"token=25956496","level_":"MINOR","tag_":"PowerStats","id_":"11994072552538324655","info_":""}
    # hisysevent -l -g SECURITY
    {"domain_":"ACCOUNT","name_":"PERMISSION_EXCEPTION","type_":3,"time_":1667484405993,"tz_":"+0000","pid_":614,"tid_":614,"uid_":3058,"CALLER_UID":1024,"CALLER_PID":523,"PERMISSION_NAME":"ohos.permission.MANAGE_LOCAL_ACCOUNTS","level_":"CRITICAL","tag_":"security","id_":"15077995598140341422","info_":""}
    # hisysevent -l -o MULTIMODALINPUT -g BEHAVIOR
    {"domain_":"MULTIMODALINPUT","name_":"Z_ORDER_WINDOW_CHANGE","type_":4,"time_":1667549852735,"tz_":"+0000","pid_":2577,"tid_":2588,"uid_":6696,"OLD_ZORDER_FIRST_WINDOWID":-1,"NEW_ZORDER_FIRST_WINDOWID":2,"OLD_ZORDER_FIRST_WINDOWPID":-1,"NEW_ZORDER_FIRST_WINDOWPID":1458,"MSG":"The ZorderFirstWindow changing succeeded","level_":"MINOR","tag_":"PowerStats","id_":"16847308118559691400","info_":""}
    

系统事件合法性校验模式

  • 打开系统事件合法性校验模式

    hisysevent -v
    

    选项说明:

    选项名称功能说明
    -v配合订阅命令-r及查询命令-l使用,当打开事件合法性校验模式,系统事件包含的非法内容会红色高亮显示。

    命令实例:

    # hisysevent -v -l -s 1501964222980 -e 1501964222996
    # 因为HAPPEN_TIME与VERSION没有在事件领域RELIABILITY所属的事件名称APP_FREEZE下进行yaml文件配置,属于非法内容,所以这两个键会被高亮显示为红色.
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501964222980,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805201702","HAPPEN_TIME":1501964222980,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"10435592800188571430","info_":""}
    # hisysevent -v -r -o "RELIABILITY" -n "APP_FREEZE"
    {"domain_":"RELIABILITY","name_":"APP_FREEZE","type_":1,"time_":1501964644584,"pid_":1505,"uid_":10002,"FAULT_TYPE":"4","MODULE":"com.ohos.screenlock","REASON":"NO_DRAW","SUMMARY":"SUMMARY:\n","LOG_PATH":"/data/log/faultlog/faultlogger/appfreeze-com.ohos.screenlock-10002-20170805202404","HAPPEN_TIME":1501964644584,"VERSION":"1.0.0","level_":"CRITICAL","tag_":"STABILITY","id_":"11097868872446282676","info_":""}
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Benco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值