檢視原始碼 Logger.Formatter (Logger v1.16.2)

記錄的便利性和內建格式化程式。

此模組定義適當的 :logger 格式化程式,用於格式化訊息和報告為 Elixir 項目,並提供其他功能,例如時區轉換、截斷和著色。此格式化程式預設由 Logger 使用,您可以使用下列方式設定它

config :logger, :default_formatter,
  format: "\n$time $metadata[$level] $message\n",
  metadata: [:user_id]

請參閱 Logger.Formatter.new/1 以取得所有設定選項。

您也可以呼叫 new/1 並設定任何 :logger 處理常式的格式化程式來建立此格式化程式的執行個體,方法是將其 :formatter 鍵設定為 Logger.Formatter.new(options)

此模組也提供多種便利性,供希望撰寫自訂記錄格式化程式的人使用。

格式化

記錄訊息可以由格式化字串控制。以下是一個範例

config :logger, :default_formatter,
  format: "\n$time $metadata[$level] $message\n",
  metadata: [:user_id]

上述範例會將錯誤訊息印出為

18:43:12.439 user_id=13 [error] Hello\n

您可以使用的有效參數為

  • $time - 傳送記錄訊息的時間
  • $date - 傳送記錄訊息的日期
  • $message - 記錄訊息
  • $level - 記錄層級
  • $node - 印出訊息的節點
  • $metadata - 使用者控制的資料,以 "key=val key2=val2 " 格式呈現

格式化函數

如果您希望變更訊息的格式化方式,但保留 Logger.Formatter 提供的所有其他功能,例如截斷和著色,您也可以使用 {module, function_name} 元組自訂記錄訊息的格式。不過,如果您想要完全控制格式化,請考慮撰寫自訂 :logger 格式化程式,它可以完全存取所有事件和元資料。

使用 {module, function_name} 時,函式將呼叫層級、訊息、時間戳記和元資料,如下所示

defmodule MyConsoleLogger do
  @spec format(atom, chardata, Logger.Formatter.date_time_ms(), keyword()) :: IO.chardata()
  def format(level, message, timestamp, metadata) do
    # Custom formatting logic that must return chardata.
    # ...
  end
end

元資料

傳送至記錄器的元資料可以使用 Logger.metadata/0Logger.metadata/1 函式讀取和寫入。例如,您可以設定 Logger.metadata([user_id: 13]) 以將 user_id 元資料新增至目前的處理程序。使用者可以設定後端,選擇要列印的元資料,並取代 $metadata 值。

摘要

函式

將樣式或函式編譯成 format/5 可以處理的資料結構。

將日期格式化為 chardata。

格式化記錄事件的訊息。

將時間格式化為 chardata。

初始化 :logger 處理器的格式化器。

從清單中移除無效的 Unicode 編碼點和無效的 UTF-8 位元組。

將元資料中的系統時間(以微秒為單位)轉換為 date_time_ms 元組。

chardata 截斷為 n 位元組。

類型

@type date() :: {1970..10000, 1..12, 1..31}
@type date_time_ms() :: {date(), time_ms()}
@type pattern() :: :date | :level | :levelpad | :message | :metadata | :node | :time
@type time_ms() :: {0..23, 0..59, 0..59, 0..999}

函式

連結至此函式

compile(pattern_or_function)

檢視原始碼
@spec compile(binary() | nil) :: [pattern() | binary()]
@spec compile(pattern) :: pattern when pattern: {module(), function :: atom()}

將樣式或函式編譯成 format/5 可以處理的資料結構。

查看模組文件,以取得將內插至樣式的有效參數文件。如果您將 nil 傳遞為樣式,則樣式預設為

"\n$time $metadata[$level] $message\n"

如果您想要使用自訂函式自訂格式化,您可以傳遞 {module, function_name} 元組。

此函數與 format/5 一起,是 Logger.Formatter.new/1 用於格式化訊息的主要建構區塊。有興趣建立自訂格式化程式的人員也可以使用它。

範例

iex> Logger.Formatter.compile("$time $metadata [$level] $message\n")
[:time, " ", :metadata, " [", :level, "] ", :message, "\n"]

iex> Logger.Formatter.compile({MyLoggerFormatter, :format})
{MyLoggerFormatter, :format}
連結至此函式

format(pattern_or_function, level, message, timestamp, metadata)

檢視原始碼
@spec format(
  mod_and_fun | [pattern() | binary()],
  Logger.level(),
  Logger.message(),
  date_time_ms(),
  keyword()
) :: IO.chardata()
when mod_and_fun: {atom(), atom()}

格式化 compile/1 傳回的 pattern_or_function

它會採用已編譯的格式,並注入層級、時間戳記、訊息和元資料關鍵字清單,並傳回格式正確的字串。

如果 pattern_or_function{module, function_name} 叢集,則會呼叫 module.function_name(level, message, timestamp, metadata) 以取得訊息。

此函數與 compile/1 一起,是 Logger.Formatter.new/1 用於格式化訊息的主要建構區塊。有興趣建立自訂格式化程式的人員也可以使用它。

範例

iex> pattern = Logger.Formatter.compile("[$level] $message")
iex> timestamp = {{1977, 01, 28}, {13, 29, 00, 000}}
iex> formatted = Logger.Formatter.format(pattern, :info, "hello", timestamp, [])
iex> IO.chardata_to_string(formatted)
"[info] hello"
@spec format_date(date()) :: IO.chardata()

將日期格式化為 chardata。

連結至此函式

format_event(log_event, truncate)

檢視原始碼
@spec format_event(:logger.log_event(), pos_integer() | :infinity) :: IO.chardata()

格式化記錄事件的訊息。

連結至此函式

format_time(time_ms_tuple)

檢視原始碼
@spec format_time(time_ms()) :: IO.chardata()

將時間格式化為 chardata。

初始化 :logger 處理器的格式化器。

支援的選項為

  • :colors - 著色選項的關鍵字清單。

  • :format - 用於列印記錄的格式訊息。預設為:"\n$time $metadata[$level] $message\n"。它也可以是 {module, function_name} 叢集,會以記錄層級、訊息、目前時間戳記和元資料呼叫它,而且必須傳回 IO.chardata/0。請參閱模組文件,以取得有關 :format 的更多資訊。

  • :metadata - 要由 $metadata 列印的元資料。預設為空清單(沒有元資料)。將 :metadata 設定為 :all 會列印所有元資料。請參閱 Logger 文件中的「元資料」區段,以取得更多資訊。

  • :truncate - 要記錄的最大訊息大小(以位元組為單位)。預設為 8192 位元組。請注意,此組態為近似值。已截斷的訊息結尾會加上 " (truncated)"。可以傳遞原子 :infinity 來停用此行為。

  • :utc_log - 如果為 true,則在記錄中使用 UTC。預設使用當地時間(因為預設為 false)。

:colors 關鍵字清單中支援的鍵為

  • :enabled - 布林值,允許開啟和關閉著色。預設為:IO.ANSI.enabled?/0

  • :debug - 除錯訊息的顏色。預設為::cyan

  • :info - 資訊和通知訊息的顏色。預設為::normal

  • :warning - 警告訊息的顏色。預設為::yellow

  • :error - 錯誤和更高訊息的顏色。預設為::red

請參閱 IO.ANSI 模組以取得顏色和屬性的清單。訊息的顏色也可以透過 :ansi_color 元資料針對每個訊息進行設定。

@spec prune(IO.chardata()) :: IO.chardata()

從清單中移除無效的 Unicode 編碼點和無效的 UTF-8 位元組。

通常在無法列印資料時,在格式化後呼叫。

連結至此函式

system_time_to_date_time_ms(system_time, utc_log? \\ false)

檢視原始碼
@spec system_time_to_date_time_ms(integer(), boolean()) :: date_time_ms()

將元資料中的系統時間(以微秒為單位)轉換為 date_time_ms 元組。

@spec truncate(IO.chardata(), non_neg_integer() | :infinity) :: IO.chardata()

chardata 截斷為 n 位元組。

我們可能會在字元群組中間進行截斷,但我們絕不會在二進制代碼點中間進行截斷。因此,截斷並非精確的。