錄製記錄

您可能會看到幾個 Fuchsia 程式產生記錄訊息的方式:

  • LogSink 服務
  • 核心的偵錯記錄檔
  • 兩者組合,透過 stdoutstderr 轉送

LogSink/Syslog

如要產生記錄訊息,請呼叫 fuchsia.logger/LogSink.Connectfuchsia.logger.LogSink 服務必須在元件資訊清單中 use

Connect 會採用通訊端,而實際記錄訊息是由系統記錄程式庫「寫入」

如果通訊端的緩衝區已滿,寫入執行緒會捨棄記錄。系統會計算寫入者端遭捨棄的訊息數,且會在下一次成功的訊息中傳送該計數,之後計數器就會重設。log_listener 發現遺失的郵件時,會列印警告

LogSink 服務必須快速清空所接收的所有通訊端,以免訊息在寫入者端遭到捨棄。LogSink 負責清空這些通訊端以填入內部緩衝區 (TODO(https://fxbug.dev/42124432):自 https://fxrev.dev/490158 起不再為 true)。這可能會導致寫入元件和 LogSink 在持續記錄時耗用大量 CPU 資源。

不同語言會使用不同機制與 LogSink 對話。詳情請參閱相關頁面:

偵錯記錄檔控點

核心可讓程式從根資源建立偵錯記錄控制代碼,每個控制代碼都允許其擁有者將訊息寫入核心的共用環形緩衝區。每則訊息都有 ZX_LOG_RECORD_DATA_MAX 個位元組的限制,超出的數量上限會遭到截斷。

除了繫結至檔案描述元之外,偵錯記錄檔控制代碼也可以傳遞至 debuglog_writedebuglog_read 系統呼叫。讀取的系統呼叫用於將資料從偵錯記錄檔轉移到系統記錄。

要透過 fuchsia.boot.WriteOnlyLog 通訊協定將標準串流傳送至偵錯記錄檔取得存取權的元件。

大多數寫入偵錯記錄檔控制代碼的記錄都是透過 stdio 轉送來寫入。

標準串流:stdoutstderr

這些概念與其他作業系統許多相同,但這些概念在 Fuchsia 中的使用方式相當複雜,因為在系統的不同部分中轉送方式不同。

驅動程式

驅動程式會記錄 LogSink 接收器服務,但需使用 zxlogf 進行記錄。這個函式會為 Syslog 程式庫提供包裝函式,讓每個驅動程式庫都有自己的記錄訊息通訊端。

此外,driver_manager 會將 stdoutstderr 繫結至偵錯記錄。如此一來,driver_manager 就可以將重要資訊輸出至偵錯記錄檔,或是在無法使用 LogSink 服務的特定產品設定時改回使用偵錯記錄檔。

元件

根據預設,如果元件可存取 LogSink 服務進行轉送,則只會擷取其 stdoutstderr 串流。詳情請參閱 ELF 執行元件一節轉送 stdout 和 stderr 串流

將 klog 轉送至 Syslog

Archivist 會持續從 klog 讀取這些訊息,並將這些訊息轉送至主記錄。如果訊息來自 klog 的訊息在保有 klog 緩衝區的情況下,就會遭到管道捨棄,但這些訊息尚未追蹤到 klog 緩衝區。

所有核心記錄訊息都會傳送至系統記錄嚴重性為「INFO」的系統記錄,因為偵錯記錄檔的系統呼叫無法表示訊息的嚴重性。