nl::Weave::Profiles::DataManagement_Current::LoggingManagement

#include <src/lib/profiles/data-management/Current/LoggingManagement.h>

用于管理内存中事件日志的类。

摘要

构造函数和析构函数

LoggingManagement(nl::Weave::WeaveExchangeManager *inMgr, size_t inNumBuffers, const LogStorageResources *const inLogStorageResources)
LoggingManagement 构造函数。
LoggingManagement(void)
LoggingManagement 默认构造函数。

公共函数

BlitEvent(EventLoadOutContext *aContext, const EventSchema & inSchema, EventWriterFunct inEventWriter, void *inAppData, const EventOptions *inOptions)
用于根据事件日志记录协议写入事件标头和数据的帮助程序函数。
CancelShutdownInProgress(void)
void
将 mShutdownInProgress 标志设置为 false。
CheckShouldRunWDM(void)
bool
根据未安排上传的事件缓冲区中的字节数,决定是否分流事件。
FetchEventsSince(nl::Weave::TLV::TLVWriter & ioWriter, ImportanceType inImportance, event_id_t & ioEventID)
一个函数,用于检索自指定事件 ID 以来具有指定重要性的事件。
GetBytesWritten(void) const
uint32_t
获取自此日志以来写入此日志的总字节数(涵盖所有事件重要性)。
GetEventReader(nl::Weave::TLV::TLVReader & ioReader, ImportanceType inImportance)
一种用于检查内存中的日志缓冲区的辅助方法。
GetFirstEventID(ImportanceType inImportance)
获取当前存储的特定重要性级别的第一个事件 ID。
GetLastEventID(ImportanceType inImportance)
获取特定重要性级别的最新提供的 ID。
IsShutdownInProgress(void)
bool
检查 mShutdownInProgress 标志。
IsValid(void)
bool
IsValid 返回 LoggingManagement 实例是否有效。
LoadEvents(TLVReader & reader)
加载之前保留的 Weave 事件。
LogEvent(const EventSchema & inSchema, EventWriterFunct inEventWriter, void *inAppData, const EventOptions *inOptions)
通过包含选项的回调来记录事件。
MarkShutdownInProgress(void)
void
将 mShutdownInProgress 标志设置为 true。
NotifyEventsDelivered(ImportanceType inImportance, event_id_t inLastDeliveredEventID, uint64_t inRecipientNodeID)
void
RegisterEventCallbackForImportance(ImportanceType inImportance, FetchExternalEventsFunct inFetchCallback, NotifyExternalEventsDeliveredFunct inNotifyCallback, NotifyExternalEventsEvictedFunct inEvictedCallback, size_t inNumEvents, event_id_t *outLastEventID)
用于注册一组外部存储事件的公共 API。
RegisterEventCallbackForImportance(ImportanceType inImportance, FetchExternalEventsFunct inFetchCallback, NotifyExternalEventsDeliveredFunct inNotifyCallback, size_t inNumEvents, event_id_t *outLastEventID)
用于注册一组外部存储事件的公共 API。
RegisterEventCallbackForImportance(ImportanceType inImportance, FetchExternalEventsFunct inFetchCallback, size_t inNumEvents, event_id_t *outLastEventID)
用于注册一组外部存储事件的公共 API。
ScheduleFlushIfNeeded(bool inFlushRequested)
安排日志分流任务。
SerializeEvents(TLVWriter & writer)
将所有重要性类型的 Weave 事件序列化。
SetBDXUploader(LogBDXUpload *inUploader)
void
SetExchangeManager(nl::Weave::WeaveExchangeManager *inMgr)
设置要与此日志记录子系统搭配使用的 WeaveExchangeManager
SetLoggingEndpoint(event_id_t *inEventEndpoints, size_t inNumImportanceLevels, size_t & outLoggingPosition)
SkipEvent(EventLoadOutContext *aContext)
void
用于跳过写入与已分配事件 ID 对应的事件的辅助函数。
ThrottleLogger(void)
void
ThrottleLogger 将有效日志记录级别提升到生产级别。
UnregisterEventCallbackForImportance(ImportanceType inImportance, event_id_t inEventID)
void
用于取消注册一组外部存储事件的公共 API。
UnthrottleLogger(void)
void
UnthrottleLogger 将有效日志记录级别恢复为配置的日志记录级别。

公共静态函数

CreateLoggingManagement(nl::Weave::WeaveExchangeManager *inMgr, size_t inNumBuffers, const LogStorageResources *const inLogStorageResources)
void
创建 LoggingManagement 对象,并使用提供的资源初始化日志记录管理子系统。
DestroyLoggingManagement(void)
void
在关停时执行我们需要的所有操作。
GetInstance(void)

公共函数

BlitEvent

WEAVE_ERROR BlitEvent(
  EventLoadOutContext *aContext,
  const EventSchema & inSchema,
  EventWriterFunct inEventWriter,
  void *inAppData,
  const EventOptions *inOptions
)

用于根据事件日志记录协议写入事件标头和数据的帮助程序函数。

具体说明
参数
[in,out] aContext
EventLoadOutContext(使用缓冲区的有状态信息进行初始化)。BlitEvent 使用此上下文更新和保留状态。
[in] inSchema
架构,用于定义此事件的重要性、个人资料 ID 和结构类型。
[in] inEventWriter
为序列化事件数据而调用的回调函数。
[in] inAppData
回调的应用上下文。
[in] inOptions
EventOptions,用于描述时间戳以及与此事件相关的其他标记。

CancelShutdownInProgress

void CancelShutdownInProgress(
  void
)

将 mShutdownInProgress 标志设置为 false。

CheckShouldRunWDM

bool CheckShouldRunWDM(
  void
)

根据未安排上传的事件缓冲区中的字节数,决定是否分流事件。

该函数的行为通过 WEAVE_CONFIG_EVENT_LOGGING_BYTE_THRESHOLD 常量控制。如果自上次发送 WDM 通知后系统写入的字节数超过了上述字节数,则该函数会指出现在会触发 NotificationEngine

具体说明
返回值
true
事件应分流
false
否则

FetchEventsSince

WEAVE_ERROR FetchEventsSince(
  nl::Weave::TLV::TLVWriter & ioWriter,
  ImportanceType inImportance,
  event_id_t & ioEventID
)

一个函数,用于检索自指定事件 ID 以来具有指定重要性的事件。

给定 nl::Weave::TLV::TLVWriter、重要性和事件 ID,该函数将提取自指定事件以来具有指定重要性的事件。该函数会继续提取事件,直到 nl::Weave::TLV::TLVWriter 或日志中的空间用尽。该函数将在事件边界上终止写入事件。

具体说明
参数
[in] ioWriter
用于存储事件的写入者
[in] inImportance
要提取的事件的重要性
[in,out] ioEventID
在输入时,为获取事件之前的事件 ID。完成后,提取的最后一个事件的 ID。
返回值
WEAVE_END_OF_TLV
函数已达到指定重要性级别的可用日志条目的末尾
WEAVE_ERROR_NO_MEMORY
ioWriter 中的函数空间用尽,日志中有更多事件可以使用。
WEAVE_ERROR_BUFFER_TOO_SMALL
ioWriter 中的函数空间用尽,日志中有更多事件可以使用。

GetBytesWritten

uint32_t GetBytesWritten(
  void
) const 

获取自此日志以来写入此日志的总字节数(涵盖所有事件重要性)。

具体说明
返回值
写入日志的字节数。

GetEventReader

WEAVE_ERROR GetEventReader(
  nl::Weave::TLV::TLVReader & ioReader,
  ImportanceType inImportance
)

一种用于检查内存中的日志缓冲区的辅助方法。

具体说明
参数
[in,out] ioReader
对读取器的引用,将使用事件日志中的后备存储空间初始化
[in] inImportance
对读者的起始重要性。请注意,在这种情况下,起始重要性有点反感:除了其专用缓冲区之外,更重要的事件还会与不太重要的事件共享缓冲区。因此,在传入 Debug 重要性时,读取器遍历的数据最少。
返回值
WEAVE_NO_ERROR 无条件。

GetFirstEventID

event_id_t GetFirstEventID(
  ImportanceType inImportance
)

获取当前存储的特定重要性级别的第一个事件 ID。

具体说明
参数
inImportance
重要性级别
返回值
event_id_t 当前存储的该事件重要性的第一个事件 ID

GetLastEventID

event_id_t GetLastEventID(
  ImportanceType inImportance
)

获取特定重要性级别的最新提供的 ID。

具体说明
参数
inImportance
重要性级别
返回值
event_id_t 表示相应事件重要性的最新事件 ID

IsShutdownInProgress

bool IsShutdownInProgress(
  void
)

检查 mShutdownInProgress 标志。

IsValid

bool IsValid(
  void
)

IsValid 返回 LoggingManagement 实例是否有效。

具体说明
返回值
true
实例有效(已使用适当的后备存储空间初始化)
false
否则

LoadEvents

WEAVE_ERROR LoadEvents(
  TLVReader & reader
)

加载之前保留的 Weave 事件。

LogEvent

event_id_t LogEvent(
  const EventSchema & inSchema,
  EventWriterFunct inEventWriter,
  void *inAppData,
  const EventOptions *inOptions
)

通过包含选项的回调来记录事件。

该函数会记录一个表示为 EventWriterFunct 的事件和一个应用特定的 appData 上下文。该函数会写入事件元数据,并使用 nl::Weave::TLV::TLVWriter 引用和 inAppData 上下文调用 inEventWriter,以便用户代码可以直接将事件数据发送到事件日志。这种形式的事件日志记录可最大限度地减少内存消耗,因为事件数据会直接序列化到目标缓冲区。事件数据必须包含可在由 inProfileIDinEventType 标识的架构中解读的上下文标记。第一个元素的标记将被忽略;事件日志记录系统会使用 eventData 标记替换它。

如果架构重要性超过 LoggingConfiguration 中指定的日志记录阈值,则系统会记录该事件。如果事件的重要性未达到当前阈值,系统会将其删除,并且函数会返回 0 作为生成的事件 ID。

此调用变体允许调用方设置 EventOptions 的任意组合:

  • 时间戳,如果默认为 0,则默认为调用点的当前时间;
  • 事件来源的“root”部分(事件来源和特征 ID);如果为 NULL,则默认为当前设备。该事件会被标记为与正在调用的设备相关。
  • 用于对事件 ID 进行分组的相关事件 ID;如果相关事件 ID 为 0,则该事件将被标记为与任何其他事件无关
  • 紧急;默认为非紧急。

具体说明
参数
[in] inSchema
架构,用于定义此事件的重要性、个人资料 ID 和结构类型。
[in] inEventWriter
为实际序列化事件数据而调用的回调函数
[in] inAppData
回调的应用上下文。
[in] inOptions
事件元数据选项。可以为 NULL。
返回值
event_id_t:如果事件写入日志,则为事件 ID,否则为 0。

LoggingManagement

 LoggingManagement(
  nl::Weave::WeaveExchangeManager *inMgr,
  size_t inNumBuffers,
  const LogStorageResources *const inLogStorageResources
)

LoggingManagement 构造函数。

使用 LogStorageResources 数组初始化 LoggingManagement。数组必须为每个有效的重要性级别提供资源,数组的元素必须为重要性递增的数值(并且重要性递减);数组中的第一个元素对应于为最关键事件分配的资源,最后一个元素对应于最不重要的事件。

具体说明
参数
[in] inMgr
WeaveExchangeManager(用于此日志记录子系统)
[in] inNumBuffers
inLogStorageResources 数组中的元素数量
[in] inLogStorageResources
每个重要性级别的 LogStorageResources 数组。

LoggingManagement

 LoggingManagement(
  void
)

LoggingManagement 默认构造函数。

提供的主要目的是让编译器满意。

具体说明
返回值

MarkShutdownInProgress

void MarkShutdownInProgress(
  void
)

将 mShutdownInProgress 标志设置为 true。

NotifyEventsDelivered

void NotifyEventsDelivered(
  ImportanceType inImportance,
  event_id_t inLastDeliveredEventID,
  uint64_t inRecipientNodeID
)

RegisterEventCallbackForImportance

WEAVE_ERROR RegisterEventCallbackForImportance(
  ImportanceType inImportance,
  FetchExternalEventsFunct inFetchCallback,
  NotifyExternalEventsDeliveredFunct inNotifyCallback,
  NotifyExternalEventsEvictedFunct inEvictedCallback,
  size_t inNumEvents,
  event_id_t *outLastEventID
)

用于注册一组外部存储事件的公共 API。

注册 FetchExternalEventsFunct 形式的回调。此 API 要求平台知道注册时的事件数量。内部工作方式也要求此数字是常量。由于此 API 不允许平台注册特定的事件 ID,因此这会阻止平台持久存储事件(至少使用唯一的事件 ID)。

每当订阅者尝试提取该范围内的事件 ID 次数不限时,系统都会调用该回调函数,直至其取消注册。

当外部提供程序想要在事件已传送给订阅者以及外部事件对象被逐出时收到通知时,应使用函数的此变体。

事件传送后,外部提供程序会收到相关通知,包括接收者的节点 ID 和传送给该接收者的最后一个事件的 ID。请注意,外部提供方可能会多次收到有关同一事件 ID 的通知。对处理程序没有特定限制,特别是处理程序可以取消注册外部事件 ID。

如果外部事件对象被逐出日志缓冲区,则系统会通知外部提供程序,以及外部事件对象的副本。

如果失败,指向 ExternalEvents 结构体的指针将为 NULL,否则将填充分配给回调函数的开始和结束事件 ID。此指针应该用于取消注册这组事件。

如需详细了解回调必须实现的内容,请参阅 FetchExternalEventsFunct 文档。

具体说明
参数
[in] inImportance
重要性级别
[in] inFetchCallback
用于注册以提取外部事件的回调
[in] inNotifyCallback
用于注册传送通知的回调
[in] inEvictedCallback
用于注册逐出通知的回调
[in] inNumEvents
此集中的事件数量
[out] outLastEventID
指向 event_id_t 的指针;成功注册外部事件后,该函数将存储与外部事件块的最后一个事件 ID 相对应的事件 ID。该参数可以为 NULL。
返回值
WEAVE_ERROR_NO_MEMORY
如果没有更多可用的回调槽。
WEAVE_ERROR_INVALID_ARGUMENT
Null 函数回调或没有要注册的事件。
WEAVE_NO_ERROR
成功时。

RegisterEventCallbackForImportance

WEAVE_ERROR RegisterEventCallbackForImportance(
  ImportanceType inImportance,
  FetchExternalEventsFunct inFetchCallback,
  NotifyExternalEventsDeliveredFunct inNotifyCallback,
  size_t inNumEvents,
  event_id_t *outLastEventID
)

用于注册一组外部存储事件的公共 API。

注册 FetchExternalEventsFunct 形式的回调。此 API 要求平台知道注册时的事件数量。内部工作方式也要求此数字是常量。由于此 API 不允许平台注册特定的事件 ID,因此这会阻止平台持久存储事件(至少使用唯一的事件 ID)。

每当订阅者尝试提取该范围内的事件 ID 次数不限时,系统都会调用该回调函数,直至其取消注册。

当外部提供程序想要在事件已传送给订阅者时收到通知,而不是在外部事件对象被逐出时,应使用函数的此变体。事件传送后,外部提供程序会收到相关通知,包括接收者的节点 ID 和传送给该接收者的最后一个事件的 ID。请注意,外部提供方可能会多次收到有关同一事件 ID 的通知。对处理程序没有特定限制,特别是处理程序可以取消注册外部事件 ID。

如果失败,指向 ExternalEvents 结构体的指针将为 NULL,否则将填充分配给回调函数的开始和结束事件 ID。此指针应该用于取消注册这组事件。

如需详细了解回调必须实现的内容,请参阅 FetchExternalEventsFunct 文档。

具体说明
参数
[in] inImportance
重要性级别
[in] inCallback
用于注册以提取外部事件的回调
[in] inNotifyCallback
用于注册传送通知的回调
[in] inNumEvents
此集中的事件数量
[out] outLastEventID
指向 event_id_t 的指针;成功注册外部事件后,该函数将存储与外部事件块的最后一个事件 ID 相对应的事件 ID。该参数可以为 NULL。
返回值
WEAVE_ERROR_NO_MEMORY
如果没有更多可用的回调槽。
WEAVE_ERROR_INVALID_ARGUMENT
Null 函数回调或没有要注册的事件。
WEAVE_NO_ERROR
成功时。

RegisterEventCallbackForImportance

WEAVE_ERROR RegisterEventCallbackForImportance(
  ImportanceType inImportance,
  FetchExternalEventsFunct inFetchCallback,
  size_t inNumEvents,
  event_id_t *outLastEventID
)

用于注册一组外部存储事件的公共 API。

注册 FetchExternalEventsFunct 形式的回调。此 API 要求平台知道注册时的事件数量。内部工作方式也要求此数字是常量。由于此 API 不允许平台注册特定的事件 ID,因此这会阻止平台持久存储事件(至少使用唯一的事件 ID)。

每当订阅者尝试提取该范围内的事件 ID 次数不限时,系统都会调用该回调函数,直至其取消注册。

如果外部提供程序既没有传递外部事件,也没有外部事件对象被逐出,则应使用该函数的变体。

如果失败,指向 ExternalEvents 结构体的指针将为 NULL,否则将填充分配给回调函数的开始和结束事件 ID。此指针应该用于取消注册这组事件。

如需详细了解回调必须实现的内容,请参阅 FetchExternalEventsFunct 文档。

具体说明
参数
[in] inImportance
重要性级别
[in] inCallback
用于注册以提取外部事件的回调
[in] inNumEvents
此集中的事件数量
[out] outLastEventID
指向 event_id_t 的指针;成功注册外部事件后,该函数将存储与外部事件块的最后一个事件 ID 相对应的事件 ID。该参数可以为 NULL。
返回值
WEAVE_ERROR_NO_MEMORY
如果没有更多可用的回调槽。
WEAVE_ERROR_INVALID_ARGUMENT
Null 函数回调或没有要注册的事件。
WEAVE_NO_ERROR
成功时。

ScheduleFlushIfNeeded

WEAVE_ERROR ScheduleFlushIfNeeded(
  bool inFlushRequested
)

安排日志分流任务。

该函数可决定是否要调度任务分流进程,如果是,则安排 LoggingFlushHandler 在 Weave 线程上异步运行。

是否安排刷新时间取决于以下三个因素:

显式请求刷新缓冲区

事件缓冲区的状态以及尚未与事件使用方同步的数据量

是否存在待处理的请求刷新请求事件。

安排刷新的显式请求通过输入参数传递。

自动刷新通常安排在事件缓冲区包含足够的数据,可以启动新的分流时。根据分流策略,也可以考虑其他触发器,例如分流之间的最短和最长时间。

事件日志的待处理状态由 mUploadRequested 变量表示。由于此函数可由多个线程调用,因此必须以原子方式读取和设置 mUploadRequested,以避免在发送通知前调度冗余 LoggingFlushHandler

具体说明
参数
inRequestFlush
一个布尔值,表示是否应安排刷新,而不考虑内部缓冲区管理政策。
返回值
WEAVE_ERROR_INCORRECT_STATE
LoggingManagement 模块未完全初始化。
WEAVE_NO_ERROR
成功时。

SerializeEvents

WEAVE_ERROR SerializeEvents(
  TLVWriter & writer
)

将所有重要性类型的 Weave 事件序列化。

将 WeaveCircularTLVBuffer 中的事件及相关状态序列化到所提供的缓冲区中。

此方法旨在供在休眠状态下不保留 RAM 的设备使用,允许在进入休眠状态前保留事件,从而防止事件丢失

SetBDXUploader

void SetBDXUploader(
  LogBDXUpload *inUploader
)

SetExchangeManager

WEAVE_ERROR SetExchangeManager(
  nl::Weave::WeaveExchangeManager *inMgr
)

设置要与此日志记录子系统搭配使用的 WeaveExchangeManager

在某些平台上,此操作可能需要与上面的 CreateLoggingManagement() 分开进行。

具体说明
参数
[in] inMgr
WeaveExchangeManager(用于此日志记录子系统)

SetLoggingEndpoint

WEAVE_ERROR SetLoggingEndpoint(
  event_id_t *inEventEndpoints,
  size_t inNumImportanceLevels,
  size_t & outLoggingPosition
)

SkipEvent

void SkipEvent(
  EventLoadOutContext *aContext
)

用于跳过写入与已分配事件 ID 对应的事件的辅助函数。

具体说明
参数
[in,out] aContext
EventLoadOutContext(使用缓冲区的有状态信息进行初始化)。BlitEvent 使用此上下文更新和保留状态。

ThrottleLogger

void ThrottleLogger(
  void
)

ThrottleLogger 将有效日志记录级别提升到生产级别。

UnregisterEventCallbackForImportance

void UnregisterEventCallbackForImportance(
  ImportanceType inImportance,
  event_id_t inEventID
)

用于取消注册一组外部存储事件的公共 API。

取消注册回调函数会阻止 LoggingManagement 针对一组事件调用回调函数。LoggingManagement 将不再向订阅者发送这些事件 ID。

其意图是让一个函数一次提供一组事件。如果需要使用同一函数注册一组新事件,则应先取消注册回调,然后重新注册。这意味着无法再提取原来的那组事件。

此函数无条件成功。如果回调从未注册或已取消注册,则为空操作。

具体说明
参数
[in] inImportance
重要性级别
[in] inEventID
与要取消注册的外部事件块中的任意事件对应的事件 ID。

UnthrottleLogger

void UnthrottleLogger(
  void
)

UnthrottleLogger 将有效日志记录级别恢复为配置的日志记录级别。

公共静态函数

CreateLoggingManagement

void CreateLoggingManagement(
  nl::Weave::WeaveExchangeManager *inMgr,
  size_t inNumBuffers,
  const LogStorageResources *const inLogStorageResources
)

创建 LoggingManagement 对象,并使用提供的资源初始化日志记录管理子系统。

使用 LogStorageResources 数组初始化 LoggingManagement。数组必须为每个有效的重要性级别提供资源,数组的元素必须为重要性递增的数值(并且重要性递减);数组中的第一个元素对应于为最关键事件分配的资源,最后一个元素对应于最不重要的事件。

具体说明
参数
[in] inMgr
WeaveExchangeManager(用于此日志记录子系统)
[in] inNumBuffers
inLogStorageResources 数组中的元素数量
[in] inLogStorageResources
每个重要性级别的 LogStorageResources 数组。

DestroyLoggingManagement

void DestroyLoggingManagement(
  void
)

在关停时执行我们需要的所有操作。

GetInstance

LoggingManagement & GetInstance(
  void
)