访问日志

与其他诊断一样,可以从 Archivist 的 ArchiveAccessor 协议读取日志。如需了解有关此 API 及其用法的一般信息,请参阅 ArchiveAccessor 参考文档

参数

StreamParameters 传递给 StreamDiagnostics 方法以初始化 BatchIterator

DataType

发送 LOGS 数据类型以向 Archivist 请求日志。

StreamMode

日志适用于 SNAPSHOTSNAPSHOT_THEN_SUBSCRIBESUBSCRIBE 模式。

格式

目前仅支持 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 中的其他数据类型一样,每个对象都包含多个字段,但 metadatapayload 的内容与其他来源不同:

{
    "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 取代,日后将被删除。