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 系統呼叫無法表示訊息的嚴重程度。