Fuchsia 具有多个可观测性系统,可帮助您对组件执行诊断,例如:
日志
日志是 Fuchsia 程序发出的按时间排序的诊断数据流。 它们最常见的形式是低频、面向人类的文本字符串,用于描述子系统中的状态变化。
目录
日志包含多条元数据,这些元数据大多由生成特定日志的每个组件自行报告。日志消息至少包含时间戳和字符串内容。
此外,如果使用受支持的库将日志消息写入 LogSink 协议,则该消息会包含严重级别、PID、TID、先前丢弃的日志计数以及字符串标记列表。并非所有元数据都是必需的,但受支持的库可确保在将记录写入通过 LogSink 获取的套接字时,每个字段都有值。
Archivist 会向组件写入套接字的数据中插入额外的元数据。如需详细了解 Archivist 为 Fuchsia 设备日志提供的字段,请参阅日志记录。
存储
目前,所有日志存储区都按先进先出 (FIFO) 的方式轮替,较新的消息会覆盖较旧的消息。来自任何组件的消息都可以推出其他任何组件的消息。
Fuchsia 中的日志可以存储在以下类型的内存中:
易失
Fuchsia 设备上有两个用于存储日志的内存中存储区:
klog或 debuglog,即内核中的 128kb 缓冲区。syslog,它是 Archivist 中可配置的缓冲区。
在处理日志时,请务必了解 Fuchsia 如何写入日志,以便更好地找到日志可能存储的位置,因为这会说明这些缓冲区中的哪一个是消息的预期传输点。
常驻
反馈数据组件会维护系统上一次启动时消息的 persistent_disk_store。
使用 ffx target snapshot 定位 Fuchsia 设备时,您可以看到这些消息。
使用日志
如需开始使用日志记录功能,您可能需要:
检查
Inspect 为组件提供了在运行时公开其状态的结构化分层信息的能力。组件使用 Inspect 格式托管映射的虚拟内存对象 (VMO),以公开包含此内部状态的 Inspect 层次结构。注意:如需详细了解 Inspect VMO 文件格式,请参阅 Inspect VMO 文件格式。
使用“检查”功能
如需开始使用 Inspect,您可能需要:
档案管理员
Archivist 会从 Inspect 和 Fuchsia 日志中提取数据,并通过 fuchsia.diagnostics/ArchiveAccessor 协议提供这些数据。
Archivist 通过 fuchsia.component.EventStream 从组件框架中提取生命周期事件:
- 请求的功能:Archivist 会收到
Capability requested事件,这些事件用于连接到fuchsia.logger.LogSink和fuchsia.inspect.InspectSink,从而允许其归因 Inspect 和日志。
CapabilityRequested 个事件
CapabilityRequested 事件是一种机制,可为日志和 Inspect 提供归因元数据,例如名字和组件网址。
Archivist-manifest exposes fuchsia.logger.LogSink 就像任何其他协议功能一样,但它也会 uses 框架中的事件,并将其绑定到其命名空间中的协议:
为了更好地了解其工作原理,请查看 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.
{
program: {
runner: "elf",
binary: "bin/archivist",
lifecycle: { stop_event: "notify" },
forward_stdout_to: "none",
forward_stderr_to: "none",
use_next_vdso: "true",
},
capabilities: [
{
dictionary: "diagnostics-accessors",
path: "/svc/fuchsia.component.runtime.DictionaryRouter",
},
{
// NOTE: fuchsia.diagnostics.ArchiveAccessor.logs exposes unredacted
// system logs prior to redaction by Feedback. Routing this protocol
// to any component other than /core/feedback is restricted by
// security policy in //src/security/policy/component_manager_policy_base.json5
// and requires a Fuchsia Privacy review.
protocol: [
"fuchsia.diagnostics.ArchiveAccessor.logs",
"fuchsia.diagnostics.LogFlusher",
"fuchsia.diagnostics.LogSettings",
"fuchsia.diagnostics.SaltProvider",
"fuchsia.diagnostics.system.SerialLogControl",
"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",
},
{
protocol: [ "fuchsia.component.runtime.Capabilities" ],
from: "framework",
},
],
expose: [
{
protocol: [
"fuchsia.diagnostics.ArchiveAccessor.logs",
"fuchsia.diagnostics.LogFlusher",
"fuchsia.diagnostics.LogSettings",
"fuchsia.diagnostics.SaltProvider",
"fuchsia.diagnostics.system.SerialLogControl",
"fuchsia.inspect.InspectSink",
"fuchsia.logger.Log",
"fuchsia.logger.LogSink",
],
from: "self",
},
{
dictionary: "diagnostics-accessors",
from: "self",
},
],
}
这会导致组件管理器将传入请求从默认 fuchsia.io 命名空间协议重定向到 fuchsia.component.EventStream 协议。Archivist 会通过此协议接收事件,并从组件管理器发送的 EventHeader 以及 LogSink 通道的句柄中检索归因元数据。描述符中包含的 moniker 是在事件标头中构建的。
为 LogSink 配置 capability_requested 事件不会影响功能路由本身,只会影响将通道作为事件(而非 Open())传递给 Archivist。这意味着,对于组件拓扑的其余部分,用于传递属性化 LogSink 的 CML 保持不变。如需了解详情,请参阅协议打开的生命周期和事件文档。
归因 LogSink 连接
当 Fuchsia 组件想要写入日志时,它必须在其传入目录中获取与 fuchsia.logger.LogSink 的连接,该连接通常由 Archivist 的实例提供。
典型的 Fuchsia 服务连接是匿名的,因此服务器和客户端没有关于彼此的身份信息。客户端只能看到其命名空间(例如 /svc/fuchsia.logger.LogSink)中的服务,而服务器会看到对其传入命名空间的匿名 Open() 请求。
归因日志记录提供可信的归因元数据,以便更好地监控、存储、查询和呈现日志。此归因元数据用于标识传入 LogSink 连接的来源,这是通过 CapabilityRequested 事件完成的。