Fuchsia 採用線路格式,產生靈感來自於追蹤記錄格式的結構化記錄。這個傳輸格式可讓您以記錄檔的形式使用及傳播任意資料結構。
驗證
記錄檔記錄大小上限為 32 KB。
如果寫入者將超大型或無效的記錄傳送至診斷服務,其串流會關閉,且診斷服務會記錄錯誤。
基本
整數採用小端編碼。帶正負號整數則是兩個相輔相成的整數。
時間戳記是 64 位元的整數,以奈秒為單位,由 zx_clock_get_monotonic
記錄。
字串會以 16 位元的「字串參照」表示。如果最高有效位元 (MSB) 為 0,則字串為空白。如果 MSB 為 1,則參照的其餘位元會指出後續 UTF-8 位元組串流的長度。除空字串以外,所有 MSB 為 0 的字串參照,都會保留給日後的擴充功能。字串會以零填充,直到對齊 8 位元組為止。
記錄由多個 8 位元組字組成,且會對齊 8 位元組。
標頭
記錄檔記錄的必要中繼資料為記錄類型、記錄的整體長度,以及時間戳記。這些字串在記錄的前 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}
目前所有記錄都必須含有 type=9。這個選項已選擇複製追蹤記錄格式,但可能需要變更設定,追蹤工具才能處理這些記錄。嚴重性值的定義位於 /sdk/fidl/fuchsia.diagnostics/severity.fidl
引數
記錄記錄資料會透過一組型別為鍵/值的清單傳送。鍵一律是不會為空白的字串,可支援不同類型的引數,而值則可有多種類型。
引數標頭
每個引數都有 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|
|---+-----------+-----------------------------------------------|
| 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
為「舊版」格式訊息編碼
呼叫 LogSink.Connect
的元件應以「datagram」模式 (而非「串流」) 傳遞通訊端,並在其中寫入「舊版」線路格式。這會使用少量單端整數,並混合使用以長度為開頭和以空值結束的 UTF-8 字串。
目前僅供 Go Logger 實作使用。