与其他诊断一样,可以从 Archivist 的 ArchiveAccessor 协议读取日志。如需了解有关此 API 及其用法的一般信息,请参阅 ArchiveAccessor 参考文档。
参数
将 StreamParameters 传递给 StreamDiagnostics
方法以初始化 BatchIterator。
DataType
发送 LOGS
数据类型以向 Archivist 请求日志。
StreamMode
日志适用于 SNAPSHOT
、SNAPSHOT_THEN_SUBSCRIBE
和 SUBSCRIBE
模式。
格式
目前仅支持 JSON
。
ClientSelectorConfiguration
目前支持 select_all=true
。
batch_retrieval_timeout_seconds
在请求日志时,此选项不起作用,因为在日志查询期间,Archivist 必须等待组件生成日志是没有意义的。
成果
结果以 vector<FormattedContent>
的形式返回,且每个条目的变体与请求的格式匹配,但 JSON 是当前唯一支持的格式。
缓冲区内容
每个缓冲区都包含一个顶级数组,其所有元素都作为对象:
[
{
"metadata": { ... },
"payload": { ... }
},
{
"metadata": { ... },
"payload": { ... }
},
...
]
第二级嵌套允许 Archivist 高效地打包日志消息,同时使用相同的 API 提供 Inspect 结果,其中解析的 VMO 和返回的 VMO 之间存在 1:1 的映射。
JSON 对象内容
数组中的每个 JSON 对象都是一个日志消息或事件。与 ArchiveAccessor 中的其他数据类型一样,每个对象都包含多个字段,但 metadata
和 payload
的内容与其他来源不同:
{
"version": 1,
"moniker": "core/network/netstack",
"metadata": {
"timestamp": 1234567890,
"severity": "INFO",
"component_url": "fuchsia-pkg://fuchsia.com/network#meta/netstack.cm",
"size_bytes": 123
},
"payload": {
"root": {
"pid": 78,
"tid": 78,
"tag": "netstack",
"message": "something happened!"
}
}
}
时间戳
日志中的时间使用内核的单调时钟进行记录,并以无符号整数的形式传送,无需进行任何修改。
丢弃的日志
丢弃的日志在结果对象的 metadata.errors
字段中传输,该字段存在时是一个数组:
{
"metadata": {
...
"errors": [
{
"dropped_logs": {
"count": 3
}
}
]
}
}
丢失日志的消息不一定具有关联的 payload
,具体取决于消息的放置位置。
当生成组件溢出其日志套接字时,它会递增一个计数器,在后续成功的发送中使用此计数器来填充日志元数据中的字段。归档人员会跟踪此元数据,但无法得知某个组件是否丢弃了日志记录,除非通过该组件的后续日志记录。元数据以相同的形式传递给客户端,作为已填充的日志记录中的错误字段。
如果消息因缓冲区限制而被 Archivist 删除,错误将以不带载荷的合成消息发送,以确保即使给定的生产者未再次记录,客户端也能收到通知。
旧版 API
Archivist 提供 fuchsia.logger.Log
协议,允许客户端读取文本格式的日志。此 API 已被 fuchsia.diagnostics.ArchiveAccessor
取代,日后将被删除。