檢視原始碼 logger_formatter 行為 (核心 v10.2)
Logger 的預設格式化工具。
每個 Logger 處理器都有一個已設定的格式化工具,指定為模組和組態詞。格式化工具的目的是將日誌事件轉換為最終的可列印字串 (unicode:chardata()
),該字串可以寫入處理器的輸出裝置。有關更多資訊,請參閱核心使用者指南中的 處理器 和 格式化工具 章節。
logger_formatter
是 Logger 使用的預設格式化工具。
另請參閱
calendar
, error_logger
, io
, io_lib
, logger
, maps
, sasl(6)
, unicode
摘要
回呼:格式化工具回呼函式
當設定或修改格式化工具組態時,Logger 會呼叫此函式。格式化工具必須驗證給定的組態,如果正確則傳回 ok
,如果錯誤則傳回 {error,Reason}
。
日誌處理器可以呼叫此函式,將日誌事件詞轉換為可列印字串。例如,可以使用 io:put_chars/1,2
將傳回的值列印為日誌條目到主控台或檔案。
類型
-type config() :: #{chars_limit => pos_integer() | unlimited, depth => pos_integer() | unlimited, legacy_header => boolean(), max_size => pos_integer() | unlimited, report_cb => logger:report_cb(), single_line => boolean(), template => template(), time_designator => byte(), time_offset => integer() | [byte()]}.
logger_formatter
的組態詞是一個 映射,並且可以將以下鍵設定為組態參數
chars_limit = integer() > 0 | unlimited
- 一個正整數,表示呼叫io_lib:format/3
時要使用的同名選項的值。此值限制每個日誌事件列印的字元總數。請注意,這是一個軟性限制。對於硬式截斷限制,請參閱選項max_size
。預設值為
unlimited
。depth = integer() > 0 | unlimited
- 一個正整數,表示此格式化工具應列印詞的最大深度。傳遞給此格式化工具的格式字串會被改寫。格式控制 ~p 和 ~w 會分別替換為 ~P 和 ~W,並且該值會用作深度參數。有關詳細資訊,請參閱 STDLIB 中的io:format/2,3
。預設值為
unlimited
。legacy_header = boolean()
- 如果設定為true
,則會將標頭欄位新增至Metadata
的 logger_formatter 部分。此欄位的值是一個字串,類似於舊error_logger
事件處理器建立的標頭。可以透過將清單[logger_formatter,header]
新增至範本中,將其包含在日誌事件中。有關更多資訊,請參閱template/0
類型的描述。預設值為
false
。max_size = integer() > 0 | unlimited
- 一個正整數,表示此格式化工具傳回的字串可以擁有的絕對最大大小。如果格式化後的字串在可能受限於chars_limit
或depth
之後更長,則會將其截斷。預設值為
unlimited
。report_cb =
logger:report_cb/0
- 格式化工具使用報告回呼,將報告形式的日誌訊息轉換為格式字串和引數。可以在日誌事件的中繼資料中指定報告回呼。如果中繼資料中沒有報告回呼,logger_formatter
將使用logger:format_report/1
作為預設回呼。如果設定此組態參數,它會取代預設報告回呼和中繼資料中找到的任何報告回呼。也就是說,所有報告都會由此設定的函式轉換。
single_line = boolean()
- 如果設定為true
,則每個日誌事件都會列印為單行。為了實現這一點,logger_formatter
會將格式字串中所有~p
和~P
控制序列的欄位寬度設定為0
(請參閱io:format/2
),並將訊息中的所有換行符號替換為", "
。換行符號後面的空白字元會直接移除。請注意,template
參數新增的換行符號不會被替換。預設值為
true
。template =
template/0
- 範本描述如何透過組合日誌事件中的不同資料值來組成格式化後的字串。有關此項的更多資訊,請參閱template/0
類型的描述。time_designator = byte()
- 時間戳記會根據 RFC3339 格式化,時間指示符是作為日期和時間分隔符號使用的字元。預設值為
$T
。此參數的值會用作
calendar:system_time_to_rfc3339/2
的time_designator
選項。time_offset = integer() | [byte()]
- 時間偏移量,字串或整數,用於格式化時間戳記。空字串會解讀為本地時間。
"Z"
、"z"
或0
值會解讀為世界協調時間 (UTC)。除了
"Z"
、"z"
或""
之外的字串,必須採用±[hh]:[mm]
格式,例如"-02:00"
或"+00:00"
。整數必須以微秒為單位,這表示偏移量
7200000000
等同於"+02:00"
。預設值為空字串,這表示時間戳記會以本地時間顯示。但是,為了保持向後相容性,如果 SASL 組態參數
utc_log
=true
,預設值會變更為"Z"
,這表示時間戳記會以 UTC 顯示。此參數的值會用作
calendar:system_time_to_rfc3339/2
的offset
選項。
-type template() :: [metakey() | {metakey(), template(), template()} | unicode:chardata()].
logger 格式化工具要使用的範本。
範本是原子、原子清單、元組和字串的清單。原子 level
或 msg
會分別被視為嚴重性層級和日誌訊息的預留位置。其他原子或原子清單會被解讀為中繼資料的預留位置,其中原子預期會比對最上層的鍵,而原子清單代表中繼資料為巢狀映射時的子鍵路徑。例如,當此映射為巢狀映射時,清單 [key1,key2]
會由 key2
欄位的值取代。單獨的原子 key1
會由 key1
欄位的完整值取代。這些值會轉換為字串。
#{key1 => #{key2 => my_value,
...}
...}
範本中的元組表示中繼資料鍵的 if-exist 測試。例如,以下元組表示如果 key1
存在於中繼資料映射中,則列印 "key1=Value"
,其中 Value
是 key1
在中繼資料映射中關聯的值。如果 key1
不存在,則不列印任何內容。
{key1, ["key1=",key1], []}
範本中的字串會按原樣列印。
template
組態參數的預設值取決於 single_line
和 legacy_header
組態參數的值,如下所示。
範例中使用的日誌事件為
?LOG_ERROR("name: ~p~nexit_reason: ~p", [my_name, "It crashed"])
legacy_header = true, single_line = false
- 預設範本:[[logger_formatter,header],"\n",msg,"\n"]
日誌條目範例
=ERROR REPORT==== 17-May-2018::18:30:19.453447 === name: my_name exit_reason: "It crashed"
請注意,所有八個層級都可能出現在標題中,而不僅僅是像
error_logger
產生的ERROR
、WARNING
或INFO
。而且,微秒會新增至時間戳記的結尾。legacy_header = true, single_line = true
- 預設範本:[[logger_formatter,header],"\n",msg,"\n"]
請注意,此處的範本與
single_line=false
的範本相同,但產生的日誌條目不同之處在於標頭後只有一行=ERROR REPORT==== 17-May-2018::18:31:06.952665 === name: my_name, exit_reason: "It crashed"
legacy_header = false, single_line = true
- 預設範本:[time," ",level,": ",msg,"\n"]
日誌條目範例
2018-05-17T18:31:31.152864+02:00 error: name: my_name, exit_reason: "It crashed"
legacy_header = false, single_line = false
- 預設範本:[time," ",level,":\n",msg,"\n"]
日誌條目範例
2018-05-17T18:32:20.105422+02:00 error: name: my_name exit_reason: "It crashed"
回呼:格式化工具回呼函式
-callback check_config(FConfig) -> ok | {error, Reason} when FConfig :: logger:formatter_config(), Reason :: term().
當設定或修改格式化工具組態時,Logger 會呼叫此函式。格式化工具必須驗證給定的組態,如果正確則傳回 ok
,如果錯誤則傳回 {error,Reason}
。
下列 Logger API 函式可以觸發此回呼
logger:add_handler/3
logger:set_handler_config/2,3
logger:update_handler_config/2,3
logger:update_formatter_config/2
有關範例實作,請參閱 logger_formatter
。logger_formatter
是 Logger 使用的預設格式化工具。
-callback format(LogEvent, FConfig) -> FormattedLogEntry when LogEvent :: logger:log_event(), FConfig :: logger:formatter_config(), FormattedLogEntry :: unicode:chardata().
日誌處理器可以呼叫此函式,將日誌事件詞轉換為可列印字串。例如,可以使用 io:put_chars/1,2
將傳回的值列印為日誌條目到主控台或檔案。
有關範例實作,請參閱 logger_formatter
。logger_formatter
是 Logger 使用的預設格式化工具。
函式
當設定或修改處理器的格式化工具組態時,Logger 會呼叫此函式。如果組態有效,則傳回 ok
,如果錯誤則傳回 {error,term()}
。
下列 Logger API 函式可以觸發此回呼
-spec format(LogEvent, Config) -> unicode:chardata() when LogEvent :: logger:log_event(), Config :: config().
這是要從處理器呼叫的格式化工具回呼函式。
日誌事件的處理方式如下:
- 如果訊息是報告形式,則會呼叫報告回呼函數將其轉換為
{Format,Args}
。關於報告回呼函數和日誌訊息的有效形式的更多資訊,請參閱 Kernel 使用者指南中的 日誌訊息 章節。 - 訊息大小會根據組態參數
chars_limit
和depth
的值進行限制。 - 完整的日誌條目會根據
template
組成。 - 如果最終的字串太長,則會根據組態參數
max_size
的值進行截斷。