诊断信息

Fuchsia 提供多种可观测系统来帮助您进行诊断 例如:

日志

日志是由 Fuchsia 程序发出的按时间排序的诊断数据流。 它们最常采用面向用户的低频文本字符串形式,用于描述子系统状态的变化。

目录

日志包含多个元数据,这些元数据通常由生成特定日志的每个组件自行报告。日志消息至少包含时间戳和字符串内容。

此外,如果使用LogSink 它包括严重级别、PID、TID、之前的 删除的日志和字符串标记列表。并非所有元数据都是必需的 但受支持的库可确保每个字段在写入时 写入通过 LogSink 获取的套接字。

Archivist 会向组件写入套接字的数据中插入其他元数据。如需详细了解 归档管理员提供了 Fuchsia 设备日志,请参阅 日志记录

存储

目前,所有日志存储都以先进先出 (FIFO) 的原则轮替, 而较新邮件会覆盖旧邮件。任何组件的消息都可以发布来自任何其他组件的消息。

Fuchsia 中的日志可存储在以下类型的内存中:

易失性

Fuchsia 设备上有两个用于日志的内存存储区:

在使用日志时,请务必 了解 Fuchsia 如何写入日志,以便您更好地查找 可以存储日志的位置,因为日志说明了其中哪个缓冲区是目标缓冲区 。

常驻

反馈数据组件会维护系统上次启动时的消息的 persistent_disk_store

使用 ffx target snapshot 定位 Fuchsia 设备时,您会看到这些消息。

使用日志

如需开始使用日志记录功能,您可能需要:

检查

借助“检查”功能,组件能够在运行时公开有关其状态的结构化分层信息。组件托管一个映射的虚拟 使用检查格式公开检查层次结构的内存对象 (VMO) 包含此内部状态。注意:如需详细了解 Inspect VMO 文件格式,请参阅 Inspect VMO 文件格式

使用 Inspect

如需开始使用 Inspect,您可能需要:

档案管理员

Archivist 会从 Inspect 和 Fuchsia 日志提取数据,并通过 fuchsia.diagnostics/ArchiveAccessor 协议提供这些数据。

归档程序通过 fuchsia.component.EventStream 从组件框架提取生命周期事件:

  • 请求的功能:归档程序会接收与 fuchsia.logger.LogSinkfuchsia.inspect.InspectSink 的连接的 Capability requested 事件,以便归因 Inspect 和日志。

CapabilityRequested 个事件

CapabilityRequested 事件是提供日志和检查 标记和组件网址等归因元数据。

Archivist-manifest exposefuchsia.logger.LogSink 与任何其他协议功能一样,但它还 use 了框架中的事件,将其绑定到其命名空间中的协议:

为了更好地了解其工作原理,请查看 Archivist 的 CML 文件:

// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This shard is meant to contain stuff that is meant to be shared across all flavors of the
// archivist.
{
    include: [ "//src/diagnostics/archivist/meta/config.shard.cml" ],
    program: {
        runner: "elf",
        lifecycle: { stop_event: "notify" },
    },
    capabilities: [
        {
            protocol: [
                "fuchsia.diagnostics.ArchiveAccessor",
                "fuchsia.diagnostics.host.ArchiveAccessor",
                "fuchsia.diagnostics.LogSettings",
                "fuchsia.inspect.InspectSink",
                "fuchsia.logger.Log",
                "fuchsia.logger.LogSink",
            ],
        },
    ],
    use: [
        {
            event_stream: [ "capability_requested" ],
            from: "parent",
            path: "/events/log_sink_requested_event_stream",
            filter: { name: "fuchsia.logger.LogSink" },
        },
        {
            event_stream: [ "capability_requested" ],
            from: "parent",
            path: "/events/inspect_sink_requested_event_stream",
            filter: { name: "fuchsia.inspect.InspectSink" },
        },
        {
            protocol: [ "fuchsia.tracing.provider.Registry" ],
            availability: "optional",
        },
        {
            protocol: [ "fuchsia.inspect.InspectSink" ],
            from: "self",
        },
    ],
    expose: [
        {
            protocol: [
                "fuchsia.diagnostics.ArchiveAccessor",
                "fuchsia.diagnostics.host.ArchiveAccessor",
                "fuchsia.diagnostics.LogSettings",
                "fuchsia.inspect.InspectSink",
                "fuchsia.logger.Log",
                "fuchsia.logger.LogSink",
            ],
            from: "self",
        },
    ],
}

这会导致组件管理器重定向来自默认 fuchsia.io 命名空间协议 fuchsia.component.EventStream 协议。档案保管员收到 事件,从 EventHeader 中检索归因元数据 由组件管理器与 LogSink 通道句柄一起发送。描述符中包含的标识名是在事件标头中构建的。

LogSink 配置 capability_requested 事件不会影响 capability 路由本身,只会影响将渠道作为事件(而非 Open())传递给归档管理器。这意味着,对于组件拓扑的其余部分,用于传递带属性的 LogSink 的 CML 保持不变。如需了解详情,请参阅协议打开生命周期事件文档

归因 LogSink 连接

当 Fuchsia 组件想要写入日志时,必须获取其传入目录中 fuchsia.logger.LogSink 的连接,该连接通常由归档程序实例提供。

典型的 Fuchsia 服务连接是匿名的,这样,服务器和 客户之间没有任何身份信息。客户端只会看到其命名空间(例如 /svc/fuchsia.logger.LogSink)中的服务,而服务器会看到对其传入命名空间的匿名 Open() 请求。

归因日志记录可提供可靠的归因元数据, 更好地监控、存储、查询和呈现日志。此归因元数据用于标识传入 LogSink 连接的来源,这通过 CapabilityRequested 事件完成。