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 记录器实现使用。