錄製記錄

Fuchsia 元件產生記錄訊息的方式有幾種:

  • fuchsia.logger.LogSink 通訊協定。
  • 核心為 debuglog
  • 上述任一組合,透過 stdoutstderr 傳送。

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_writedebuglog_read 系統呼叫。

如果元件需要將標準串流傳送至 debuglog,就必須將 fuchsia.boot.WriteOnlyLog 轉送至該元件。

寫入 debuglog 控制代碼的大部分記錄都是透過 stdio 轉送寫入。

標準串流:stdoutstderr

您可能在其他作業系統中熟悉這些概念,但由於這些概念在系統的不同部分以不同方式路由傳送,因此在 Fuchsia 中使用這些概念可能很複雜。

司機

驅動程式會使用 LogSink 通訊協定記錄,但會透過自己的程式庫執行這項操作。這個程式庫會包裝 syslog 程式庫,讓每個驅動程式庫都有自己的記錄器。

此外,driver_manager 會將 stdoutstderr 繫結至 debuglog。這項功能可讓 driver_manager 將重要資訊輸出至 debuglog,或回退至 debuglog

元件

根據預設,元件只有在可透過 LogSink 通訊協定轉送時,才會擷取 stdoutstderr 串流。詳情請參閱「轉送 stdout 和 stderr 執行元件」一節。

klog 轉接至 syslog

Archivist 會持續從 klog 讀取訊息,並將這些訊息轉送至 syslog 記錄檔。如果郵件在 Archivist 將其讀取至 syslog 前,就從 klog 緩衝區推出,管道可能會捨棄這些郵件。klog

所有核心記錄訊息都會傳送至系統記錄,嚴重程度為 INFO,因為 debuglog 系統呼叫無法表示訊息的嚴重程度。