Fuchsia 的跟踪记录格式受其启发,为结构化日志采用传输格式。此传输 格式允许以日志记录形式使用和传播任意数据结构。
验证
日志记录的大小上限为 32kb。
向诊断服务发送超大或无效记录的写入者将获得其数据流 并且诊断服务会记录错误。
原语
整数采用小端序编码。有符号整数是二进制补码。
时间戳是有符号的 64 位整数,以纳秒为单位,由
zx_clock_get_monotonic
。
字符串由 16 位“字符串引用”表示。如果最高有效位 (MSB) 为 0,则该字符串为 为空。如果 MSB 为 1,则引用的剩余位表示后续 UTF-8 的长度 字节流。MSB 为 0(空字符串除外)的所有字符串引用均预留以供将来使用 。字符串将填入零,直到实现 8 字节对齐。
记录由多个 8 字节的字组成,按 8 字节对齐。
记录
建议实现者使用 /sdk/fidl/fuchsia.diagnostics.stream/record.fidl 作为“参考”测试时用于记录的 API 进行微调。这些类型支持对日志读取器和写入器的互操作性进行交叉验证。
标题
日志记录必需的元数据包括记录类型、记录的总长度以及 时间戳。它们在记录的前 16 个字节中编码:
.---------------------------------------------------------------.
| |1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|4|4|4|4|4|5|5|5|5|5|6|6|
|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|
|---+-----------+-----------------------------------------------|
| T | SizeWords | Reserved | Severity|
|---------------------------------------------------------------|
| TimestampNanos |
'---------------------------------------------------------------'
T (type) = {0,3} must be 9
SizeWords = {4,15} includes header word
Reserved = {16,55} must be 0
Severity = {56,63} severity of the log record
TimestampNanos = {64,127}
目前,所有记录的类型应为 9。此选项的选择以镜像跟踪格式,但是 可能需要进行更改,然后跟踪工具才能处理这些记录。 严重级别的值在 /sdk/fidl/fuchsia.diagnostics/severity.fidl
参数
日志记录数据通过已指定类型的键值对列表进行传输。键始终非空 字符串,这支持不同类型的参数,并且值可以有多种类型。
参数标头
每个参数都有一个 8 字节标头,后跟参数名称,再后跟参数的值。 在写入参数内容之前,用 0 填充到 8 字节对齐名称。
.---------------------------------------------------------------.
| |1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|4|4|4|4|4|5|5|5|5|5|6|6|
|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|
|---+-----------+-----------------------------------------------|
| T | SizeWords | NameRef | Varies |
|---------------------------------------------------------------|
| Name (1+ words) |
'---------------------------------------------------------------'
T (type) = {0,3} see table below
SizeWords = {4,15} includes header word
NameRef = {16,31} string ref for the argument name
Varies = {32,63} varies by argument type, must be 0 if unused
NameLen = 64*NameRef
Name = {64,64+NameLen} name of the argument, padded to 8-byte alignment
参数标头的前 4 位决定了参数的类型:
T(类型) | name |
---|---|
3 |
64 位有符号整数 |
4 |
无符号 64 位整数 |
5 |
双精度浮点数 |
6 |
UTF-8 字符串 |
9 |
布尔值 |
64 位有符号整数参数
参数名称终止后将附加有符号整数。
.---------------------------------------------------------------.
| |1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|4|4|4|4|4|5|5|5|5|5|6|6|
|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|
|---+-----------+-----------------------------------------------|
| 3 | SizeWords | NameRef | Reserved |
|---------------------------------------------------------------|
| Name (1+ words) |
'---------------------------------------------------------------'
| Value |
'---------------------------------------------------------------'
T (type) = {0,3} must be 3
SizeWords = {4,15} includes header word
NameRef = {16,31} string ref for the argument name
Reserved = {32,63} must be 0
NameEnd = 64+(64*NameRef)
Name = {64,NameEnd} name of the argument, padded to 8-byte alignment
Value = {NameEnd+1,SizeWords*64}
无符号 64 位整数参数
参数名称终止后将附加无符号整数。
.---------------------------------------------------------------.
| |1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|4|4|4|4|4|5|5|5|5|5|6|6|
|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|
|---+-----------+-----------------------------------------------|
| 4 | SizeWords | NameRef | Reserved |
|---------------------------------------------------------------|
| Name (1+ words) |
'---------------------------------------------------------------'
| Value |
'---------------------------------------------------------------'
T (type) = {0,3} must be 4
SizeWords = {4,15} includes header word
NameRef = {16,31} string ref for the argument name
Reserved = {32,63} must be 0
NameEnd = 64+(64*NameRef)
Name = {64,NameEnd} name of the argument, padded to 8-byte alignment
Value = {NameEnd+1,SizeWords*64}
64 位浮点参数
系统会在参数名称终止后附加浮点数。
.---------------------------------------------------------------.
| |1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|4|4|4|4|4|5|5|5|5|5|6|6|
|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|
|---+-----------+-----------------------------------------------|
| 5 | SizeWords | NameRef | Reserved |
|---------------------------------------------------------------|
| Name (1+ words) |
'---------------------------------------------------------------'
| Value |
'---------------------------------------------------------------'
T (type) = {0,3} must be 5
SizeWords = {4,15} includes header word
NameRef = {16,31} string ref for the argument name
Reserved = {32,63} must be 0
NameEnd = 64+(64*NameRef)
Name = {64,NameEnd} name of the argument, padded to 8-byte alignment
Value = {NameEnd+1,SizeWords*64}
字符串参数
字符串采用 UTF-8 编码,在 8 字节对齐之前用零填充,并附加在 参数名称。
.---------------------------------------------------------------.
| |1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|4|4|4|4|4|5|5|5|5|5|6|6|
|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|
|---+-----------+-----------------------------------------------|
| 6 | SizeWords | NameRef | ValueRef | Reserved |
|---------------------------------------------------------------|
| Name (1+ words) |
'---------------------------------------------------------------'
| Value (1+ words) |
'---------------------------------------------------------------'
T (type) = {0,3} must be 6
SizeWords = {4,15} includes header word
NameRef = {16,31} string ref for the argument name
ValueRef = {32,47} string ref for the argument value
Reserved = {48,63} must be 0
NameEnd = 64+(64*NameRef)
Name = {64,NameEnd} name of the argument, padded to 8-byte alignment
Value = {NameEnd+1,SizeWords*64}
布尔值参数
布尔值会附加在参数标头中的 NameRef
字段之后。
.---------------------------------------------------------------.
| |1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|4|4|4|4|4|5|5|5|5|5|6|6|
|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|4|6|8|0|2|
|---+-----------+-----------------------------------------------|
| 9 | SizeWords | NameRef |B| Reserved |
|---------------------------------------------------------------|
| Name (1+ words) |
'---------------------------------------------------------------'
T (type) = {0,3} must be 9
SizeWords = {4,15} includes header word
NameRef = {16,31} string ref for the argument name
B (BoolValue) = {32} boolean value
Reserved = {33,63} must be 0
NameEnd = 64+(64*NameRef)
Name = {64,NameEnd} name of the argument, padded to 8-byte alignment
对“legacy”进行编码设置消息格式
调用 LogSink.Connect
的组件应在“datagram”中传递套接字模式(如
而不是“streaming”),并将“legacy”线缆格式连接到该接口。它使用小端字节序
整数以及以长度为前缀和以 null 结尾的 UTF-8 字符串的组合。
目前,只有 Go 日志记录器实现会使用此方法。