您可能會看到幾個 Fuchsia 程式產生記錄訊息的方式:
- LogSink 服務
- 核心的偵錯記錄檔
- 兩者組合,透過
stdout
或stderr
轉送
LogSink
/Syslog
如要產生記錄訊息,請呼叫 fuchsia.logger/LogSink.Connect
。fuchsia.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_write
和 debuglog_read
系統呼叫。讀取的系統呼叫用於將資料從偵錯記錄檔轉移到系統記錄。
要透過 fuchsia.boot.WriteOnlyLog
通訊協定將標準串流傳送至偵錯記錄檔取得存取權的元件。
大多數寫入偵錯記錄檔控制代碼的記錄都是透過 stdio 轉送來寫入。
標準串流:stdout
和 stderr
這些概念與其他作業系統許多相同,但這些概念在 Fuchsia 中的使用方式相當複雜,因為在系統的不同部分中轉送方式不同。
驅動程式
驅動程式會記錄 LogSink
接收器服務,但需使用 zxlogf
進行記錄。這個函式會為 Syslog 程式庫提供包裝函式,讓每個驅動程式庫都有自己的記錄訊息通訊端。
此外,driver_manager
會將 stdout
和 stderr
繫結至偵錯記錄。如此一來,driver_manager
就可以將重要資訊輸出至偵錯記錄檔,或是在無法使用 LogSink
服務的特定產品設定時改回使用偵錯記錄檔。
元件
根據預設,如果元件可存取 LogSink
服務進行轉送,則只會擷取其 stdout
和 stderr
串流。詳情請參閱 ELF 執行元件一節轉送 stdout 和 stderr 串流。
將 klog 轉送至 Syslog
Archivist 會持續從 klog 讀取這些訊息,並將這些訊息轉送至主記錄。如果訊息來自 klog 的訊息在保有 klog 緩衝區的情況下,就會遭到管道捨棄,但這些訊息尚未追蹤到 klog 緩衝區。
所有核心記錄訊息都會傳送至系統記錄嚴重性為「INFO」的系統記錄,因為偵錯記錄檔的系統呼叫無法表示訊息的嚴重性。