錄製記錄

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

  • fuchsia.logger.LogSink 通訊協定。
  • 核心是 debuglog
  • 上述項目的組合,透過 stdoutstderr 進行路由。

LogSink/syslog

如要產生記錄訊息,元件必須呼叫 fuchsia.logger.LogSink/ConnectStructuredfuchsia.logger.LogSink 通訊協定必須在元件資訊清單中use。這個通訊協定會在 diagnostics 字典中進行路由。元件必須直接接收 fuchsia.logger.LogSink 通訊協定,才能使用 parent 格式,或更常見的,接收完整的 diagnostics 字典,才能使用 parent/diagnostics 中的 fuchsia.logger.LogSink 通訊協定。

ConnectStructured 會取得實際記錄訊息由 syslog 程式庫寫入的通訊端。如果 Socket 緩衝區已滿,則依預設,寫入執行緒會捨棄記錄檔。如果寫入端有任何遺漏的記錄訊息,系統會計算這些訊息,並在下一個成功傳送的訊息中傳送該計數,之後計數器就會重設。ffx log 在偵測到遺漏的訊息時,會顯示警告訊息LogSink 伺服器必須盡快排空收到的所有 Socket,以免訊息在寫入端遭到捨棄。

不同語言使用不同的機制連線至 LogSink

debuglog 句柄

核心可讓元件從根資源建立 debuglog 句柄。每個句柄都允許其擁有者將訊息寫入 核心的共用環形緩衝區。每則訊息的大小上限為 ZX_LOG_RECORD_DATA_MAX 位元組,超過上限的內容會遭到截斷。

除了可繫結至檔案描述元debuglog 句柄也可以傳遞至 debuglog_writedebuglog_read 系統呼叫。

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

寫入 debuglog 句柄的記錄大多是透過 stdio 轉寄寫入。

標準串流:stdoutstderr

雖然這些概念在其他作業系統中可能很熟悉,但在 Fuchsia 中使用這些概念可能會變得複雜,因為這些概念在系統的不同部分會以不同的方式進行路由。

驅動程式

驅動程式會使用 LogSink 通訊協定記錄資料,但會透過使用 zxlogf 進行記錄。這個函式會在 syslog 程式庫周圍提供包裝函式,讓每個驅動程式庫都有各自的記錄訊息通訊端。

此外,driver_manager 會將 stdoutstderr 繫結至 debuglog。這可讓 driver_manager 將重要資訊輸出至 debuglog,或改用 debuglog

元件

根據預設,元件只有在能夠存取 LogSink 通訊協定進行轉送時,才會擷取 stdoutstderr 串流。詳情請參閱 ELF 執行元件的轉送 stdout 和 stderr 串流一節。

klog 轉寄至 syslog

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

所有核心記錄訊息都會以 INFO 嚴重性傳送至系統記錄,因為 debuglog 系統呼叫沒有方法可以表示訊息的嚴重性。