檢視原始碼 logger_std_h (kernel v10.2)

Logger 的標準處理器。

這是 Logger 的標準處理器。可以將此處理器的多個實例添加到 Logger,每個實例會將日誌輸出到 standard_iostandard_error 或檔案。

此處理器具有過載保護機制,可以在高日誌事件負載期間保持處理器程序和核心應用程式的運作。有關過載保護如何運作以及如何配置的說明,請參閱 使用者指南

若要新增標準處理器的新實例,請使用 logger:add_handler/3。處理器組態引數是一個 map,其中可以包含一般組態參數(如 使用者指南 中所述)和處理器特定的參數。特定的資料會儲存在鍵為 config 的子 map 中,並且可以包含以下參數:

  • type = io:standard_io/0 | io:standard_error/0 | file | {device, io:device/0 } - 指定日誌目的地。

    此值在新增處理器時設定,並且無法在執行時變更。

    預設為 standard_io,除非指定了參數 file,在這種情況下預設為 file

  • file = file:filename/0 - 當處理器的類型為 file 時,此參數指定日誌檔的名稱。

    此值在新增處理器時設定,並且無法在執行時變更。

    預設為與處理器識別碼相同的名稱,位於目前目錄中。

  • modes = [ file:mode/0 ] - 此參數指定開啟日誌檔時要使用的檔案模式,請參閱 file:open/2。如果未指定 modes,則使用的預設清單為 [raw,append,delayed_write]。如果指定了 modes,則此清單會取代預設模式清單,並進行以下調整:

    • 如果清單中找不到 raw,則會將其加入。
    • 如果在清單中找不到 writeappendexclusive 中的任何一個,則會加入 append
    • 如果在清單中找不到 delayed_write{delayed_write,Size,Delay} 中的任何一個,則會加入 delayed_write

    日誌檔始終以 UTF-8 編碼。無法透過設定模式 {encoding,Encoding} 來變更編碼。

    此值在新增處理器時設定,並且無法在執行時變更。

    預設為 [raw,append,delayed_write]

  • max_no_bytes = pos_integer/0 | infinity - 此參數指定是否應輪替日誌檔。值 infinity 表示日誌檔將無限增大,而整數值則指定在達到哪個檔案大小(以位元組為單位)時輪替檔案。

    預設為 infinity

  • max_no_files = non_neg_integer/0 - 此參數指定要保留的輪替日誌檔封存數量。只有當 max_no_bytes 設定為整數值時,此參數才有意義。

    日誌封存的名稱為 FileName.0FileName.1、... FileName.N,其中 FileName 是目前日誌檔的名稱。FileName.0 是最新的封存。 N 的最大值為 max_no_files 減 1 的值。

    請注意,將此值設定為 0 不會關閉輪替。它只是指定不保留任何封存。

    預設為 0

  • compress_on_rotate = boolean/0 - 此參數指定是否應壓縮輪替的日誌檔封存。如果設定為 true,則所有封存都會使用 gzip 壓縮,並重新命名為 FileName.N.gz

    如果 max_no_bytes 的值為 infinity,則 compress_on_rotate 沒有意義。

    預設為 false

  • file_check = non_neg_integer/0 - 當 logger_std_h 記錄到檔案時,它會在每次寫入操作之前讀取日誌檔的檔案資訊。這是為了確保檔案仍然存在,並且具有與開啟時相同的 inode。這會導致一些效能損失,但可確保在檔案被外部參與者移除或重新命名的情況下,不會遺失任何日誌事件。

    為了盡量減少效能損失,可以將 file_check 參數設定為正整數值 N。只要自上次讀取以來經過的時間不超過 N 毫秒,處理器就會跳過在寫入之前讀取檔案資訊的步驟。

    請注意,當 file_check 值增大時,遺失日誌事件的風險也會增加。

    預設為 0。

  • filesync_repeat_interval = pos_integer/0 | no_repeat - 此值以毫秒為單位,指定處理器將緩衝資料寫入磁碟的檔案同步操作頻率。處理器會重複嘗試此操作,但只有在實際記錄了某些內容時才會執行新的同步。

    如果將 no_repeat 設定為值,則會停用重複的檔案同步操作,並由作業系統設定來決定資料寫入磁碟的速度。使用者也可以呼叫 filesync/1 函數來執行檔案同步。

    預設為 5000 毫秒。

還存在其他組態參數,用於自訂過載保護行為。標準處理器和 disk_log 處理器都使用相同的參數,並記錄在 使用者指南 中。

請注意,如果在執行時變更處理器的組態,則不得修改 typefilemodes 參數。

新增標準處理器的範例

logger:add_handler(my_standard_h, logger_std_h,
                   #{config => #{file => "./system_info.log",
                                 filesync_repeat_interval => 1000}}).

若要將預設處理器(最初隨核心應用程式啟動)設定為記錄到檔案而不是 standard_io,請變更核心預設記錄器組態。範例:

erl -kernel logger '[{handler,default,logger_std_h,
                      #{config => #{file => "./log.log"}}}]'

如何在啟動時將標準處理器取代為 disk_log 處理器的範例,請參閱 logger_disk_log_h 手冊。

另請參閱

logger, logger_disk_log_h

摘要

函數

將緩衝資料寫入磁碟。

函數

此函數的連結

filesync(Name)

檢視原始碼 (自 OTP 21.0 起)
-spec filesync(Name) -> ok | {error, Reason}
                  when Name :: atom(), Reason :: handler_busy | {badarg, term()}.

將緩衝資料寫入磁碟。