对结构化记录进行编码

Fuchsia 使用的结构化日志线格式灵感源自其轨迹格式。这种传输格式允许将任意数据结构作为日志记录进行使用和传播。

验证

日志记录的大小上限为 32kb。

如果写入器向诊断服务发送过大或无效的记录,诊断服务将关闭其流并记录错误。

基元

整数采用小端字节序编码。有符号整数采用二进制补码。

时间戳是 64 位有符号整数,以纳秒为单位,由 zx_clock_get_monotonic 记录。

字符串由 16 位“字符串引用”表示。如果最高有效位 (MSB) 为 0,则字符串为空。如果 MSB 为 1,则 ref 的其余位表示后续 UTF-8 字节流的长度。除空字符串以外,所有 MSB 为 0 的字符串引用均预留给未来的扩展。字符串会用零填充,直到与 8 字节对齐。

记录由若干个 8 字节字组成,并且按 8 字节对齐。

日志记录所需的元数据包括记录类型、记录的总长度和时间戳。这些信息编码在记录的前 16 个字节中:

注意:

  • “size words”字段包含标题字词。
  • 时间戳以纳秒为单位。

目前,所有记录都应具有 type=9。之所以选择这种格式,是为了与轨迹格式保持一致,但可能需要先进行更改,然后才能通过跟踪工具处理这些记录。严重程度的值在 /sdk/fidl/fuchsia.diagnostics/severity.fidl 中定义

参数

日志记录数据通过类型化键值对列表来传递。键始终是非空字符串,支持不同类型的实参,并且值可以有多种类型。

实参标题

每个实参都有一个 8 字节的标头,后跟实参名称,再后跟实参的值。 在写入实参的内容之前,系统会用零填充名称,使其与 8 字节对齐。

注意:

  • “size words”字段包含标题字词。
  • “名称引用”是实参名称的字符串引用。
  • “varies”部分因实参类型而异,如果未使用,则必须为 0。
  • “名称长度”为“64 * nameref”。
  • “name”是实参的名称,总长度(未在图表中显示)为 namelen,并填充为 8 字节对齐。

实参标头的前 4 位用于确定实参的类型:

T(类型) 名称
3 64 位有符号整数
4 无符号 64 位整数
5 双精度浮点数
6 UTF-8 字符串
9 布尔值

有符号 64 位整数实参

有符号整数附加在实参名称终止之后。

无符号 64 位整数实参

无符号整数附加在实参名称终止之后。

64 位浮点实参

浮点数附加在实参名称终止后。

字符串实参

字符串以 UTF-8 编码,用零填充直至 8 字节对齐,并附加在实参名称之后。

布尔值实参

布尔值会附加到实参标头中的 NameRef 字段之后。

对“旧版”格式的消息进行编码

调用 LogSink.Connect 的组件应以“数据报”模式(而非“流式传输”)传递套接字,并将 “旧版”网络格式写入其中。此格式使用小端整数,以及长度前缀和以 null 结尾的 UTF-8 字符串的组合。

目前,此功能仅由 Go 记录器实现使用。