Fuchsia 元件產生記錄訊息的方式有幾種:
fuchsia.logger.LogSink
通訊協定。- 核心為
debuglog
。 - 上述任一組合,透過
stdout
或stderr
傳送。
LogSink
/syslog
如要產生記錄訊息,元件應連線至 fuchsia.logger.LogSink
通訊協定,然後處理 fuchsia.logger.LogSink/OnInit
事件。fuchsia.logger.LogSink
通訊協定必須use
在元件資訊清單中。這個通訊協定會以 diagnostics
字典的一部分進行路由。元件必須直接將 fuchsia.logger.LogSink
通訊協定轉送至該元件,才能使用 parent
表單,或更常見的做法是將完整的 diagnostics
字典轉送至該元件,在這種情況下,元件可以使用 parent/diagnostics
中的 fuchsia.logger.LogSink
通訊協定。
OnInit
事件包含 IOBuffer
,用於實際傳送記錄訊息。如果 IOBuffer
已滿,系統會捨棄記錄。如果寫入器端有任何捨棄的記錄檔訊息,系統會計算這些訊息,並在下一個成功訊息中傳送該計數,然後重設計數器。ffx log
在發現訊息遭到捨棄時,會列印警告。LogSink
伺服器必須確保 IOBuffer
有足夠空間,以免訊息在寫入端遭到捨棄。
不同語言使用不同的機制連線至 LogSink
:
debuglog 控制代碼
核心可讓元件從根資源建立 debuglog
控制代碼。每個控制代碼都允許擁有者將訊息寫入核心的共用環形緩衝區。每則訊息的大小上限為 ZX_LOG_RECORD_DATA_MAX
位元組,超過上限的內容會遭到截斷。
除了可繫結至檔案描述元之外,debuglog
控制代碼也可以傳遞至 debuglog_write
和 debuglog_read
系統呼叫。
如果元件需要將標準串流傳送至 debuglog
,就必須將 fuchsia.boot.WriteOnlyLog
轉送至該元件。
寫入 debuglog
控制代碼的大部分記錄都是透過 stdio 轉送寫入。
標準串流:stdout
和stderr
您可能在其他作業系統中熟悉這些概念,但由於這些概念在系統的不同部分以不同方式路由傳送,因此在 Fuchsia 中使用這些概念可能很複雜。
司機
驅動程式會使用 LogSink
通訊協定記錄,但會透過自己的程式庫執行這項操作。這個程式庫會包裝 syslog
程式庫,讓每個驅動程式庫都有自己的記錄器。
此外,driver_manager
會將 stdout
和 stderr
繫結至 debuglog
。這項功能可讓 driver_manager
將重要資訊輸出至 debuglog
,或回退至 debuglog
。
元件
根據預設,元件只有在可透過 LogSink
通訊協定轉送時,才會擷取 stdout
和 stderr
串流。詳情請參閱「轉送 stdout 和 stderr 執行元件」一節。
將 klog
轉接至 syslog
Archivist 會持續從 klog
讀取訊息,並將這些訊息轉送至 syslog
記錄檔。如果郵件在 Archivist 將其讀取至 syslog
前,就從 klog
緩衝區推出,管道可能會捨棄這些郵件。klog
所有核心記錄訊息都會傳送至系統記錄,嚴重程度為 INFO
,因為 debuglog
系統呼叫無法表示訊息的嚴重程度。