檢視原始碼 logger (核心 v10.2)

Logger 的 API 模組,Erlang/OTP 中的標準日誌記錄工具。

此模組實作 Erlang/OTP 中用於記錄日誌的主要 API。若要建立日誌事件,請使用 API 函數 或日誌 巨集,例如

?LOG_ERROR("error happened because: ~p", [Reason]).   % With macro
logger:error("error happened because: ~p", [Reason]). % Without macro

若要設定 Logger 後端,請使用 核心組態參數 或 Logger API 中的 組態函數

預設情況下,核心應用程式會在系統啟動時安裝一個日誌處理常式。此處理常式名為 default。它接收並處理 Erlang 執行時系統、標準行為和不同的 Erlang/OTP 應用程式產生的標準日誌事件。預設情況下,日誌事件會列印到終端機。

如果您希望將系統日誌列印到檔案,則必須設定預設處理常式來執行此操作。最簡單的方法是在您的 sys.config 中包含以下內容

[{kernel,
  [{logger,
    [{handler, default, logger_std_h,
      #{config => #{file => "path/to/file.log"}}}]}]}].

有關更多資訊,請參閱

巨集

以下巨集定義於 logger.hrl 中,該檔案透過指令包含在模組中

    -include_lib("kernel/include/logger.hrl").
  • ?LOG_EMERGENCY(字串或報告[,Metadata])
  • ?LOG_EMERGENCY(函式或格式,Args[,Metadata])
  • ?LOG_ALERT(字串或報告[,Metadata])
  • ?LOG_ALERT(函式或格式,Args[,Metadata])
  • ?LOG_CRITICAL(字串或報告[,Metadata])
  • ?LOG_CRITICAL(函式或格式,Args[,Metadata])
  • ?LOG_ERROR(字串或報告[,Metadata])
  • ?LOG_ERROR(函式或格式,Args[,Metadata])
  • ?LOG_WARNING(字串或報告[,Metadata])
  • ?LOG_WARNING(函式或格式,Args[,Metadata])
  • ?LOG_NOTICE(字串或報告[,Metadata])
  • ?LOG_NOTICE(函式或格式,Args[,Metadata])
  • ?LOG_INFO(字串或報告[,Metadata])
  • ?LOG_INFO(函式或格式,Args[,Metadata])
  • ?LOG_DEBUG(字串或報告[,Metadata])
  • ?LOG_DEBUG(函式或格式,Args[,Metadata])
  • ?LOG(層級,字串或報告[,Metadata])
  • ?LOG(層級,函式或格式,Args[,Metadata])

所有巨集都會展開為對 Logger 的呼叫,其中 層級 取自巨集名稱,或取自 ?LOG 巨集中的第一個引數。位置資料會加入到中繼資料,如 metadata/0 類型定義中所述。

此呼叫會包裝在 case 陳述式中,且只有在 層級 等於或低於設定的日誌層級時才會評估。

另請參閱

config, erlang, io, logger_disk_log_h, logger_filters, logger_handler, logger_formatter, logger_std_h, unicode

摘要

類型

新增或更新處理常式時使用的組態。

可以安裝為處理常式篩選器,或作為 Logger 中的主要篩選器的篩選器。

篩選函式的第二個引數。

篩選器的唯一識別碼。

篩選函式的傳回值。

格式器的組態資料。有關格式器實作的範例,請參閱logger_formatter

Logger 的處理常式組態資料。

處理常式實例的唯一識別碼。

要記錄的訊息的嚴重程度層級。

傳遞至篩選器和處理常式的日誌事件

日誌事件的中繼資料。

過載保護組態。

Logger 的主要組態資料。以下為預設值

日誌報告。

report() 轉換為格式字串和引數,或直接轉換為字串的函式。

使用 logger:timestamp()產生的時間戳記。

日誌記錄 API 函數

建立警示日誌事件。

建立嚴重日誌事件。

建立除錯日誌事件。

建立緊急日誌事件。

建立錯誤日誌事件。

建立資訊日誌事件。

在給定的日誌層級建立日誌事件,並使用要記錄的給定訊息中繼資料

在給定的日誌層級建立日誌事件,並使用要記錄的給定訊息中繼資料

建立注意日誌事件。

建立警告日誌事件。

組態 API 函數

新增具有給定組態的處理常式。

將篩選器新增至指定的處理常式。

讀取應用程式組態參數 logger 並使用其內容呼叫 add_handlers/1

將主要篩選器新增至 Logger。

查詢所有目前的 Logger 組態,包括主要、處理常式和 Proxy 組態,以及模組層級設定。

查詢所有處理常式的目前組態。

查詢給定處理常式的目前組態。

查詢所有已安裝處理常式的識別碼。

查詢所有目前的模組層級。針對每個先前使用 set_module_level/2 設定模組層級的模組,傳回包含一個 {Module,Level} 元素的列表。

查詢給定模組的目前層級。針對每個先前使用 set_module_level/2 設定模組層級的給定模組,傳回包含一個 {Module,Level} 元素的列表。

查詢 Logger 的目前主要組態。

查詢 Logger Proxy 的目前組態。

i()

漂亮列印所有 Logger 組態。

漂亮列印 Logger 組態。

移除由 HandlerId 識別的處理常式。

從由 HandlerId 識別的處理常式中移除由 FilterId 識別的篩選器。

從 Logger 中移除由 FilterId 識別的主要篩選器。

設定指定應用程式的所有模組的日誌層級。

設定指定處理常式的組態資料。這會覆寫目前的處理常式組態。

新增或更新指定處理常式的組態資料。如果給定的 Key 已存在,其關聯值將會變更為給定的值。如果不存在,則會新增。

設定指定模組的日誌等級。

設定 Logger 的主要配置資料。這會覆寫目前的配置。

為 Logger 新增或更新主要配置資料。如果給定的 Key 已經存在,其關聯的值將變更為給定的值。如果不存在,則會新增。

設定 Logger 應自動插入目前程序中所有日誌事件的中繼資料。

設定 Logger 代理的配置資料。這會覆寫目前的代理配置。Config 映射中未指定的鍵會採用預設值。

取消設定指定應用程式的所有模組的日誌等級。

移除模組特定的日誌設定。在此之後,所有模組都會使用主要日誌等級。

移除模組特定的日誌設定。在此之後,指定的模組會使用主要日誌等級。

更新指定處理程式的格式器配置。

更新指定處理程式的配置資料。此函式的行為如同以下實作方式:

新增或更新指定處理常式的組態資料。如果給定的 Key 已存在,其關聯值將會變更為給定的值。如果不存在,則會新增。

更新 Logger 的主要配置資料。此函式的行為如同以下實作方式:

設定或更新從目前程序記錄時使用的中繼資料。

更新 Logger 代理的配置資料。此函式的行為如同以下實作方式:

其他 API 函式

比較兩個日誌等級的嚴重性。如果 Level1Level2 更嚴重,則傳回 gt;如果 Level1 不如 Level2 嚴重,則傳回 lt;如果等級相等,則傳回 eq

將報告形式的日誌訊息轉換為 {Format, Args}。這是 logger_formatter 在找不到自訂報告回呼時使用的預設報告回呼。如需關於報告回呼和有效日誌訊息形式的資訊,請參閱 Kernel 使用者指南中的 日誌訊息 一節。

使用在載入 kernel 應用程式後設定的更新 kernel 配置重新設定 Logger。

傳回一個時間戳記,可作為日誌事件中繼資料中的 time 欄位插入。它是使用 os:system_time(microsecond) 產生的。

類型

連結到此類型

config_handler()

檢視原始碼 (自 OTP 21.0 起)
-type config_handler() :: {handler, logger_handler:id(), module(), logger_handler:config()}.

新增或更新處理常式時使用的組態。

連結到此類型

filter()

檢視原始碼 (自 OTP 21.0 起)
-type filter() :: {fun((log_event(), filter_arg()) -> filter_return()), filter_arg()}.

可以安裝為處理常式篩選器,或作為 Logger 中的主要篩選器的篩選器。

連結到此類型

filter_arg()

檢視原始碼 (自 OTP 21.0 起)
-type filter_arg() :: term().

篩選函式的第二個引數。

連結到此類型

filter_id()

檢視原始碼 (自 OTP 21.0 起)
-type filter_id() :: atom().

篩選器的唯一識別碼。

連結到此類型

filter_return()

檢視原始碼 (自 OTP 21.0 起)
-type filter_return() :: stop | ignore | log_event().

篩選函式的傳回值。

連結到此類型

formatter_config()

檢視原始碼 (自 OTP 21.0 起)
-type formatter_config() :: #{atom() => term()}.

格式器的組態資料。有關格式器實作的範例,請參閱logger_formatter

連結到此類型

handler_config()

檢視原始碼 (自 OTP 21.0 起)
-type handler_config() :: logger_handler:config().

Logger 的處理常式組態資料。

注意

已棄用:請改用 logger_handler:config/0

連結到此類型

handler_id()

檢視原始碼 (自 OTP 21.0 起)
-type handler_id() :: logger_handler:id().

處理常式實例的唯一識別碼。

注意

已棄用:請改用 logger_handler:id/0

連結到此類型

level()

檢視原始碼 (自 OTP 21.0 起)
-type level() :: emergency | alert | critical | error | warning | notice | info | debug.

要記錄的訊息的嚴重程度層級。

連結到此類型

log_event()

檢視原始碼 (自 OTP 21.0 起)
-type log_event() ::
          #{level := level(),
            msg := {io:format(), [term()]} | {report, report()} | {string, unicode:chardata()},
            meta := metadata()}.

傳遞至篩選器和處理常式的日誌事件

連結到此類型

metadata()

檢視原始碼 (自 OTP 21.0 起)
-type metadata() ::
          #{pid => pid(),
            gl => pid(),
            time => timestamp(),
            mfa => {module(), atom(), non_neg_integer()},
            file => file:filename(),
            line => non_neg_integer(),
            domain => [atom()],
            report_cb => report_cb(),
            atom() => term()}.

日誌事件的中繼資料。

Logger 會將以下中繼資料新增至每個日誌事件

  • pid => self()
  • gl => group_leader()
  • time => logger:timestamp()

當使用日誌巨集時,Logger 也會插入位置資訊

  • mfa => {?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY}
  • file => ?FILE
  • line => ?LINE

您可以新增自訂中繼資料,方法如下

注意

新增自訂中繼資料時,請務必不要使用上述任何鍵,因為這可能會造成日誌事件的混淆。

Logger 會合併所有中繼資料映射,然後將日誌事件轉送至處理程式。如果出現相同的鍵,則日誌呼叫中的值會覆寫處理程序中繼資料,而處理程序中繼資料會覆寫主要中繼資料,而主要中繼資料又會覆寫 Logger 設定的值。

以下自訂中繼資料鍵具有特殊意義

  • domain - 此鍵關聯的值由篩選器使用,用於分組來自特定功能區域(例如)的日誌事件。如需有關如何使用此欄位的說明,請參閱 logger_filters:domain/2

  • report_cb - 如果日誌訊息指定為 report/0,則 report_cb 鍵可以與一個 fun (報告回呼) 關聯,該 fun 將報告轉換為格式字串和引數,或直接轉換為字串。如需關於報告回呼的詳細資訊,請參閱 report_cb/0 的類型定義,以及使用者指南中的 日誌訊息 一節。

連結到此類型

msg_fun()

檢視原始碼 (自 OTP 21.0 起)
-type msg_fun() :: fun((term()) -> msg_fun_return() | {msg_fun_return(), metadata()}).
連結到此類型

msg_fun_return()

檢視原始碼 (未匯出) (自 OTP 21.0 起)
-type msg_fun_return() :: {io:format(), [term()]} | report() | unicode:chardata() | ignore.
連結到此類型

olp_config()

檢視原始碼 (自 OTP 21.0 起)
-type olp_config() :: logger_handler:olp_config().

過載保護組態。

注意

已棄用:請改用 logger_handler:olp_config/0

連結到此類型

primary_config()

檢視原始碼 (自 OTP 21.0 起)
-type primary_config() ::
          #{level => level() | all | none,
            metadata => metadata(),
            filter_default => log | stop,
            filters => [{filter_id(), filter()}]}.

Logger 的主要組態資料。以下為預設值

  • level => info
  • filter_default => log
  • filters => []
連結到此類型

report()

檢視原始碼 (自 OTP 21.0 起)
-type report() :: map() | [{atom(), term()}, ...].

日誌報告。

連結到此類型

report_cb()

檢視原始碼 (自 OTP 21.0 起)
-type report_cb() ::
          fun((report()) -> {io:format(), [term()]}) |
          fun((report(), report_cb_config()) -> unicode:chardata()).

report() 轉換為格式字串和引數,或直接轉換為字串的函式。

如需詳細資訊,請參閱使用者指南中的 日誌訊息 一節。

連結到此類型

report_cb_config()

檢視原始碼 (自 OTP 21.0 起)
-type report_cb_config() ::
          #{depth := pos_integer() | unlimited,
            chars_limit := pos_integer() | unlimited,
            single_line := boolean()}.
連結到此類型

timestamp()

檢視原始碼 (自 OTP 21.0 起)
-type timestamp() :: integer().

使用 logger:timestamp()產生的時間戳記。

記錄 API 函式

連結到此函式

alert(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec alert(String :: unicode:chardata()) -> ok;
           (Report :: report()) -> ok.

等同於 alert(字串或報告, #{})

連結到此函式

alert(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec alert(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
           (Report :: report(), Metadata :: metadata()) -> ok;
           (Format :: io:format(), Args :: [term()]) -> ok;
           (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立警示日誌事件。

若以 alert(StringOrReport, Metadata) 形式呼叫,則等同於 log(alert, StringOrReport, Metadata)

若以 alert(FormatOrFun, Args) 形式呼叫,則等同於 alert(FormatOrFun, Args, #{})

連結到此函式

alert(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec alert(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
           (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(alert, 格式或函式, Args, Metadata)

連結到此函式

critical(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec critical(String :: unicode:chardata()) -> ok;
              (Report :: report()) -> ok.

等同於 critical(字串或報告, #{})

連結到此函式

critical(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec critical(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
              (Report :: report(), Metadata :: metadata()) -> ok;
              (Format :: io:format(), Args :: [term()]) -> ok;
              (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立嚴重日誌事件。

若以 critical(StringOrReport, Metadata) 形式呼叫,則等同於 log(critical, StringOrReport, Metadata)

若以 critical(FormatOrFun, Args) 形式呼叫,則等同於 critical(FormatOrFun, Args, #{})

連結到此函式

critical(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec critical(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
              (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(critical, 格式或函式, Args, Metadata)

連結到此函式

debug(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec debug(String :: unicode:chardata()) -> ok;
           (Report :: report()) -> ok.

等同於 debug(字串或報告, #{})

連結到此函式

debug(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec debug(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
           (Report :: report(), Metadata :: metadata()) -> ok;
           (Format :: io:format(), Args :: [term()]) -> ok;
           (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立除錯日誌事件。

若以 debug(StringOrReport, Metadata) 形式呼叫,則等同於 log(debug, StringOrReport, Metadata)

若以 debug(FormatOrFun, Args) 形式呼叫,則等同於 debug(FormatOrFun, Args, #{})

連結到此函式

debug(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec debug(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
           (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(debug, 格式或函式, Args, Metadata)

連結到此函式

emergency(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec emergency(String :: unicode:chardata()) -> ok;
               (Report :: report()) -> ok.

等同於 emergency(字串或報告, #{})

連結到此函式

emergency(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec emergency(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
               (Report :: report(), Metadata :: metadata()) -> ok;
               (Format :: io:format(), Args :: [term()]) -> ok;
               (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立緊急日誌事件。

若以 emergency(StringOrReport, Metadata) 形式呼叫,則等同於 log(emergency, StringOrReport, Metadata)

若以 emergency(FormatOrFun, Args) 形式呼叫,則等同於 emergency(FormatOrFun, Args, #{})

連結到此函式

emergency(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec emergency(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
               (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(emergency, 格式或函式, Args, Metadata)

連結到此函式

error(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec error(String :: unicode:chardata()) -> ok;
           (Report :: report()) -> ok.

等同於 error(字串或報告, #{})

連結到此函式

error(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec error(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
           (Report :: report(), Metadata :: metadata()) -> ok;
           (Format :: io:format(), Args :: [term()]) -> ok;
           (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立錯誤日誌事件。

若以 error(StringOrReport, Metadata) 形式呼叫,則等同於 log(error, StringOrReport, Metadata)

若以 error(FormatOrFun, Args) 形式呼叫,則等同於 error(FormatOrFun, Args, #{})

連結到此函式

error(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec error(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
           (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(error, 格式或函式, Args, Metadata)

連結到此函式

info(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec info(String :: unicode:chardata()) -> ok;
          (Report :: report()) -> ok.

等同於 info(字串或報告, #{})

連結到此函式

info(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec info(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
          (Report :: report(), Metadata :: metadata()) -> ok;
          (Format :: io:format(), Args :: [term()]) -> ok;
          (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立資訊日誌事件。

若以 info(StringOrReport, Metadata) 形式呼叫,則等同於 log(info, StringOrReport, Metadata)

若以 info(FormatOrFun, Args) 形式呼叫,則等同於 info(FormatOrFun, Args, #{})

連結到此函式

info(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec info(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
          (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(info, 格式或函式, Args, Metadata)

連結到此函式

log(層級, 字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec log(Level :: level(), String :: unicode:chardata()) -> ok;
         (Level :: level(), Report :: report()) -> ok.

等同於 log(層級, 字串或報告, #{})

連結到此函式

log/3

檢視原始碼 (自 OTP 21.0 起)
-spec log(Level :: level(), String :: unicode:chardata(), Metadata :: metadata()) -> ok;
         (Level :: level(), Report :: report(), Metadata :: metadata()) -> ok;
         (Level :: level(), Format :: io:format(), Args :: [term()]) -> ok;
         (Level :: level(), Fun :: msg_fun(), FunArgs :: term()) -> ok.

在給定的日誌層級建立日誌事件,並使用要記錄的給定訊息中繼資料

範例:

%% A plain string
1> logger:log(info, "Hello World").
%% A plain string with metadata
2> logger:log(debug, "Hello World", #{ meta => data }).
%% A format string with arguments
3> logger:log(warning, "The roof is on ~ts",[Cause]).
%% A report
4> logger:log(warning, #{ what => roof, cause => Cause }).

若以 log(Level, FormatOrFun, Args) 形式呼叫,則等同於 log(Level, FormatOrFun, Args, #{})

連結到此函式

log(層級, 函式或格式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec log(Level :: level(), Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
         (Level :: level(), Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

在給定的日誌層級建立日誌事件,並使用要記錄的給定訊息中繼資料

訊息和元數據可以直接在引數中給定,也可以從函式 (fun) 返回。當訊息/元數據的計算成本非常高時,傳遞函式而不是直接傳遞訊息/元數據會很有用。這是因為函式只有在實際需要訊息/元數據時才會被評估,如果日誌事件不被記錄,則可能根本不會被評估。範例

%% A plain string with expensive metadata
1> logger:info(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[]).
%% An expensive report
2> logger:debug(fun(What) -> #{ what => What, cause => expensive() } end,roof).
%% A plain string with expensive metadata and normal metadata
3> logger:debug(fun([]) -> {"Hello World", #{ meta => expensive() }} end,[],
               #{ meta => data }).

當元數據同時以引數形式給定並從函式返回時,它們會被合併。如果存在相同的鍵,則會採用從函式返回的元數據中的值。

連結到此函式

notice(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec notice(String :: unicode:chardata()) -> ok;
            (Report :: report()) -> ok.

等同於 notice(字串或報告, #{})

連結到此函式

notice(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec notice(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
            (Report :: report(), Metadata :: metadata()) -> ok;
            (Format :: io:format(), Args :: [term()]) -> ok;
            (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立注意日誌事件。

若以 notice(StringOrReport, Metadata) 形式呼叫,則等同於 log(notice, StringOrReport, Metadata)

若以 notice(FormatOrFun, Args) 形式呼叫,則等同於 notice(FormatOrFun, Args, #{})

連結到此函式

notice(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec notice(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
            (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(notice, 格式或函式, Args, Metadata)

連結到此函式

warning(字串或報告)

檢視原始碼 (自 OTP 21.0 起)
-spec warning(String :: unicode:chardata()) -> ok;
             (Report :: report()) -> ok.

等同於 warning(字串或報告, #{})

連結到此函式

warning(格式或函式, Args)

檢視原始碼 (自 OTP 21.0 起)
-spec warning(String :: unicode:chardata(), Metadata :: metadata()) -> ok;
             (Report :: report(), Metadata :: metadata()) -> ok;
             (Format :: io:format(), Args :: [term()]) -> ok;
             (Fun :: msg_fun(), FunArgs :: term()) -> ok.

建立警告日誌事件。

若以 warning(StringOrReport, Metadata) 形式呼叫,則等同於 log(warning, StringOrReport, Metadata)

若以 warning(FormatOrFun, Args) 形式呼叫,則等同於 warning(FormatOrFun, Args, #{})

連結到此函式

warning(格式或函式, Args, Metadata)

檢視原始碼 (自 OTP 21.0 起)
-spec warning(Format :: io:format(), Args :: [term()], Metadata :: metadata()) -> ok;
             (Fun :: msg_fun(), FunArgs :: term(), Metadata :: metadata()) -> ok.

等同於 log(warning, 格式或函式, Args, Metadata)

配置 API 函數

連結到此函式

add_handler(HandlerId, Module, Config)

檢視原始碼 (自 OTP 21.0 起)
-spec add_handler(HandlerId, Module, Config) -> ok | {error, term()}
                     when
                         HandlerId :: logger_handler:id(),
                         Module :: module(),
                         Config :: logger_handler:config().

新增具有給定組態的處理常式。

HandlerId 是一個唯一的識別符,必須在所有後續引用此處理器的呼叫中使用。

連結到此函式

add_handler_filter(HandlerId, FilterId, Filter)

檢視原始碼 (自 OTP 21.0 起)
-spec add_handler_filter(HandlerId, FilterId, Filter) -> ok | {error, term()}
                            when
                                HandlerId :: logger_handler:id(),
                                FilterId :: filter_id(),
                                Filter :: filter().

將篩選器新增至指定的處理常式。

過濾函式 (filter fun) 會以日誌事件作為第一個參數,並以指定的 filter_args() 作為第二個參數呼叫。

函式的返回值指定是否要丟棄日誌事件或將其轉發到處理器的回呼函數。

  • log_event/0 - 過濾器通過。將套用下一個處理器過濾器 (如果有的話)。如果此處理器沒有更多過濾器,則將日誌事件轉發到處理器回呼函數。

  • stop - 過濾器未通過,並且立即丟棄日誌事件。

  • ignore - 過濾器不了解日誌事件。將套用下一個處理器過濾器 (如果有的話)。如果此處理器沒有更多過濾器,則處理器的 filter_default 配置參數的值指定是否應丟棄日誌事件或將其轉發到處理器回呼函數。

有關過濾器的更多資訊,請參閱使用者指南中的 過濾器章節。

存在一些內建的過濾器。這些過濾器在 logger_filters 中定義。

連結到此函式

add_handlers/1

檢視原始碼 (自 OTP 21.0 起)
-spec add_handlers(Application) -> ok | {error, term()} when Application :: atom();
                  (HandlerConfig) -> ok | {error, term()} when HandlerConfig :: [config_handler()].

讀取應用程式組態參數 logger 並使用其內容呼叫 add_handlers/1

自訂日誌處理器應使用此函數,以確保無論系統使用哪個處理器,配置都保持一致。通常的使用方式是在啟動處理器需要的進程後立即呼叫 logger:add_handlers/1,並將應用程式的 logger 配置作為引數傳遞。例如

-behaviour(application).
start(_, []) ->
    case supervisor:start_link({local, my_sup}, my_sup, []) of
        {ok, Pid} ->
            ok = logger:add_handlers(my_app),
            {ok, Pid, []};
        Error -> Error
     end.

這會從 my_app 應用程式讀取 logger 配置參數,並啟動已配置的處理常式。配置內容使用與記錄器處理常式配置相同的規則。

如果處理常式旨在取代預設處理常式,則必須先停用核心的預設處理常式,才能新增新的處理常式。一個停用核心處理常式並新增自訂處理常式的 sys.config 檔案可能如下所示:

[{kernel,
  [{logger,
    %% Disable the default Kernel handler
    [{handler, default, undefined}]}]},
 {my_app,
  [{logger,
    %% Enable this handler as the default
    [{handler, default, my_handler, #{}}]}]}].
連結到此函式

add_primary_filter(FilterId, Filter)

檢視原始碼 (自 OTP 21.0 起)
-spec add_primary_filter(FilterId, Filter) -> ok | {error, term()}
                            when FilterId :: filter_id(), Filter :: filter().

將主要篩選器新增至 Logger。

過濾函式 (filter fun) 會以日誌事件作為第一個參數,並以指定的 filter_args() 作為第二個參數呼叫。

函式的回傳值指定是否要捨棄記錄事件,還是轉發給處理常式。

  • log_event/0 - 篩選器通過。接下來的主要篩選器(如果有的話)會被套用。如果沒有其他主要篩選器,則記錄事件會被轉發到 Logger 的處理常式部分,其中會套用處理常式篩選器。

  • stop - 過濾器未通過,並且立即丟棄日誌事件。

  • ignore - 篩選器不了解記錄事件。接下來的主要篩選器(如果有的話)會被套用。如果沒有其他主要篩選器,則主要 filter_default 配置參數的值會指定是否應捨棄記錄事件,還是轉發到處理常式部分。

有關過濾器的更多資訊,請參閱使用者指南中的 過濾器章節。

存在一些內建的過濾器。這些過濾器在 logger_filters 中定義。

連結到此函式

get_config()

檢視原始碼 (自 OTP 21.0 起)
-spec get_config() ->
                    #{primary => primary_config(),
                      handlers => [logger_handler:config()],
                      proxy => olp_config(),
                      module_levels => [{module(), level() | all | none}]}.

查詢所有目前的 Logger 組態,包括主要、處理常式和 Proxy 組態,以及模組層級設定。

連結到此函式

get_handler_config()

檢視原始碼 (自 OTP 21.0 起)
-spec get_handler_config() -> [Config] when Config :: logger_handler:config().

查詢所有處理常式的目前組態。

連結到此函式

get_handler_config(HandlerId)

檢視原始碼 (自 OTP 21.0 起)
-spec get_handler_config(HandlerId) -> {ok, Config} | {error, term()}
                            when HandlerId :: logger_handler:id(), Config :: logger_handler:config().

查詢給定處理常式的目前組態。

連結到此函式

get_handler_ids()

檢視原始碼 (自 OTP 21.0 起)
-spec get_handler_ids() -> [HandlerId] when HandlerId :: logger_handler:id().

查詢所有已安裝處理常式的識別碼。

連結到此函式

get_module_level()

檢視原始碼 (自 OTP 21.0 起)
-spec get_module_level() -> [{Module, Level}] when Module :: module(), Level :: level() | all | none.

查詢所有目前的模組層級。針對每個先前使用 set_module_level/2 設定模組層級的模組,傳回包含一個 {Module,Level} 元素的列表。

連結到此函式

get_module_level(Modules)

檢視原始碼 (自 OTP 21.0 起)
-spec get_module_level(Modules) -> [{Module, Level}]
                          when
                              Modules :: [Module] | Module,
                              Module :: module(),
                              Level :: level() | all | none.

查詢給定模組的目前層級。針對每個先前使用 set_module_level/2 設定模組層級的給定模組,傳回包含一個 {Module,Level} 元素的列表。

連結到此函式

get_primary_config()

檢視原始碼 (自 OTP 21.0 起)
-spec get_primary_config() -> Config when Config :: primary_config().

查詢 Logger 的目前主要組態。

連結到此函式

get_process_metadata()

檢視原始碼 (自 OTP 21.0 起)
-spec get_process_metadata() -> Meta | undefined when Meta :: metadata().

擷取使用 set_process_metadata/1update_process_metadata/1 設定的資料。

連結到此函式

get_proxy_config()

檢視原始碼 (自 OTP 21.3 起)
-spec get_proxy_config() -> Config when Config :: olp_config().

查詢 Logger Proxy 的目前組態。

如需 Proxy 的詳細資訊,請參閱 Kernel 使用者指南中的 記錄器 Proxy 一節。

-spec i() -> ok.

漂亮列印所有 Logger 組態。

連結到此函式

i(What)

檢視原始碼 (自 OTP 21.3 起)
-spec i(What) -> ok when What :: primary | handlers | proxy | modules | logger_handler:id().

漂亮列印 Logger 組態。

連結到此函式

remove_handler(HandlerId)

檢視原始碼 (自 OTP 21.0 起)
-spec remove_handler(HandlerId) -> ok | {error, term()} when HandlerId :: logger_handler:id().

移除由 HandlerId 識別的處理常式。

連結到此函式

remove_handler_filter(HandlerId, FilterId)

檢視原始碼 (自 OTP 21.0 起)
-spec remove_handler_filter(HandlerId, FilterId) -> ok | {error, term()}
                               when HandlerId :: logger_handler:id(), FilterId :: filter_id().

從由 HandlerId 識別的處理常式中移除由 FilterId 識別的篩選器。

連結到此函式

remove_primary_filter(FilterId)

檢視原始碼 (自 OTP 21.0 起)
-spec remove_primary_filter(FilterId) -> ok | {error, term()} when FilterId :: filter_id().

從 Logger 中移除由 FilterId 識別的主要篩選器。

連結到此函式

set_application_level(Application, Level)

檢視原始碼 (自 OTP 21.1 起)
-spec set_application_level(Application, Level) -> ok | {error, not_loaded}
                               when Application :: atom(), Level :: level() | all | none.

設定指定應用程式的所有模組的日誌層級。

此函式是一個便利函式,會為與應用程式關聯的每個模組呼叫 logger:set_module_level/2

連結到此函式

set_handler_config(HandlerId, Config)

檢視原始碼 (自 OTP 21.0 起)
-spec set_handler_config(HandlerId, Config) -> ok | {error, term()}
                            when HandlerId :: logger_handler:id(), Config :: logger_handler:config().

設定指定處理常式的組態資料。這會覆寫目前的處理常式組態。

若要修改現有的配置,請使用 update_handler_config/2,或者,如果需要更複雜的合併,請使用 get_handler_config/1 讀取目前的配置,然後在將新的配置寫回時進行合併。

如果與目前的配置相比,移除了某個鍵,而且 Logger 知道該鍵,則會使用預設值。如果是自訂鍵,則由處理常式的實作來決定是否移除該值或插入預設值。

連結到此函式

set_handler_config(HandlerId, Key, Value)

檢視原始碼 (自 OTP 21.0 起)
-spec set_handler_config(HandlerId, level, Level) -> Return
                            when
                                HandlerId :: logger_handler:id(),
                                Level :: level() | all | none,
                                Return :: ok | {error, term()};
                        (HandlerId, filter_default, FilterDefault) -> Return
                            when
                                HandlerId :: logger_handler:id(),
                                FilterDefault :: log | stop,
                                Return :: ok | {error, term()};
                        (HandlerId, filters, Filters) -> Return
                            when
                                HandlerId :: logger_handler:id(),
                                Filters :: [{filter_id(), filter()}],
                                Return :: ok | {error, term()};
                        (HandlerId, formatter, Formatter) -> Return
                            when
                                HandlerId :: logger_handler:id(),
                                Formatter :: {module(), formatter_config()},
                                Return :: ok | {error, term()};
                        (HandlerId, config, Config) -> Return
                            when
                                HandlerId :: logger_handler:id(),
                                Config :: term(),
                                Return :: ok | {error, term()}.

新增或更新指定處理常式的組態資料。如果給定的 Key 已存在,其關聯值將會變更為給定的值。如果不存在,則會新增。

如果值不完整,例如 config 鍵的情況,則由處理常式的實作來決定如何設定未指定的部份。對於核心應用程式中的所有處理常式,config 鍵的未指定資料會設定為預設值。若要僅更新指定的資料,並保留其餘部分的現有配置,請使用 update_handler_config/3

如需不同參數的詳細資訊,請參閱 logger_handler:config/0 類型的定義。

連結到此函式

set_module_level(Modules, Level)

檢視原始碼 (自 OTP 21.0 起)
-spec set_module_level(Modules, Level) -> ok | {error, term()}
                          when Modules :: [module()] | module(), Level :: level() | all | none.

設定指定模組的日誌等級。

模組的記錄層級會覆寫 Logger 的主要記錄層級,以處理來自相關模組的記錄事件。但請注意,它不會覆寫任何處理常式的層級配置。

例如:假設 Logger 的主要記錄層級為 info,且有一個層級為 info 的處理常式 h1 和一個層級為 debug 的處理常式 h2

透過此配置,將不會記錄任何偵錯訊息,因為它們都被主要記錄層級所停止。

如果現在將 mymodule 的層級設定為 debug,則此模組的偵錯事件將由處理常式 h2 記錄,但不會由處理常式 h1 記錄。

其他模組的偵錯事件仍不會記錄。

若要變更 Logger 的主要記錄層級,請使用 set_primary_config(level, Level)

若要變更處理常式的記錄層級,請使用 set_handler_config(HandlerId, level, Level)

注意

僅當 metadata 中存在鍵 mfa,且與 {Module, Function, Arity} 相關聯時,才會偵測到記錄事件的來源模組。使用記錄巨集時,此關聯會自動新增至所有記錄事件。如果直接呼叫 API 函式而不使用巨集,則如果模組層級應生效,記錄用戶端必須明確新增此資訊。

連結到此函式

set_primary_config(Config)

檢視原始碼 (自 OTP 21.0 起)
-spec set_primary_config(Config) -> ok | {error, term()} when Config :: primary_config().

設定 Logger 的主要配置資料。這會覆寫目前的配置。

若要修改現有的配置,請使用 update_primary_config/1,或者,如果需要更複雜的合併,請使用 get_primary_config/0 讀取目前的配置,然後在將新的配置寫回時進行合併。

如果與目前的配置相比,移除了某個鍵,則會使用預設值。

連結到此函式

set_primary_config(Key, Value)

檢視原始碼 (自 OTP 21.0 起)
-spec set_primary_config(level, Level) -> ok | {error, term()} when Level :: level() | all | none;
                        (filter_default, FilterDefault) -> ok | {error, term()}
                            when FilterDefault :: log | stop;
                        (filters, Filters) -> ok | {error, term()}
                            when Filters :: [{filter_id(), filter()}];
                        (metadata, Meta) -> ok | {error, term()} when Meta :: metadata().

為 Logger 新增或更新主要配置資料。如果給定的 Key 已經存在,其關聯的值將變更為給定的值。如果不存在,則會新增。

metadata 鍵是在 OTP 24.0 中新增的。

連結到此函式

set_process_metadata(Meta)

檢視原始碼 (自 OTP 21.0 起)
-spec set_process_metadata(Meta) -> ok when Meta :: metadata().

設定 Logger 應自動插入目前程序中所有日誌事件的中繼資料。

由記錄巨集產生的位置資料,和/或作為記錄呼叫 (API 函式或巨集) 引數提供的 metadata,會與程序 metadata 合併。如果出現相同的鍵,則記錄呼叫的 metadata 引數中的值會覆寫程序 metadata 中的值,而程序 metadata 中的值又會覆寫位置資料中的值。

後續對此函式的呼叫會覆寫先前設定的資料。若要更新現有資料而非覆寫它,請參閱 update_process_metadata/1

連結到此函式

set_proxy_config(Config)

檢視原始碼 (自 OTP 21.3 起)
-spec set_proxy_config(Config) -> ok | {error, term()} when Config :: olp_config().

設定 Logger 代理的配置資料。這會覆寫目前的代理配置。Config 映射中未指定的鍵會採用預設值。

若要修改現有的配置,請使用 update_proxy_config/1,或者,如果需要更複雜的合併,請使用 get_proxy_config/0 讀取目前的配置,然後在將新的配置寫回時進行合併。

如需 Proxy 的詳細資訊,請參閱 Kernel 使用者指南中的 記錄器 Proxy 一節。

連結到此函式

unset_application_level(Application)

檢視原始碼 (自 OTP 21.1 起)
-spec unset_application_level(Application) -> ok | {error, {not_loaded, Application}}
                                 when Application :: atom().

取消設定指定應用程式的所有模組的日誌等級。

此函式是一個實用函式,會為與應用程式關聯的每個模組呼叫 logger:unset_module_level/2

連結到此函式

unset_module_level()

檢視原始碼 (自 OTP 21.0 起)
-spec unset_module_level() -> ok.

移除模組特定的日誌設定。在此之後,所有模組都會使用主要日誌等級。

連結到此函式

unset_module_level(Modules)

檢視原始碼 (自 OTP 21.0 起)
-spec unset_module_level(Modules) -> ok when Modules :: [module()] | module().

移除模組特定的日誌設定。在此之後,指定的模組會使用主要日誌等級。

連結到此函式

unset_process_metadata()

檢視原始碼 (自 OTP 21.0 起)
-spec unset_process_metadata() -> ok.

刪除透過 set_process_metadata/1update_process_metadata/1 設定的資料。

連結到此函式

update_formatter_config(HandlerId, FormatterConfig)

檢視原始碼 (自 OTP 21.0 起)
-spec update_formatter_config(HandlerId, FormatterConfig) -> ok | {error, term()}
                                 when
                                     HandlerId :: logger_handler:id(),
                                     FormatterConfig :: formatter_config().

更新指定處理程式的格式器配置。

新的組態會與現有的格式化器組態合併。

若要覆寫現有的組態而不進行任何合併,請使用

set_handler_config(HandlerId, formatter,
	      {FormatterModule, FormatterConfig}).
連結到此函式

update_formatter_config(HandlerId, Key, Value)

檢視原始碼 (自 OTP 21.0 起)
-spec update_formatter_config(HandlerId, Key, Value) -> ok | {error, term()}
                                 when HandlerId :: logger_handler:id(), Key :: atom(), Value :: term().

等同於 update_formatter_config(HandlerId, #{Key => Value})

連結到此函式

update_handler_config(HandlerId, Config)

檢視原始碼 (自 OTP 21.0 起)
-spec update_handler_config(HandlerId, Config) -> ok | {error, term()}
                               when HandlerId :: logger_handler:id(), Config :: logger_handler:config().

更新指定處理程式的配置資料。此函式的行為如同以下實作方式:

{ok, {_, Old}} = logger:get_handler_config(HandlerId),
logger:set_handler_config(HandlerId, maps:merge(Old, Config)).

若要覆寫現有的組態而不進行任何合併,請使用 set_handler_config/2

連結到此函式

update_handler_config(HandlerId, Key, Value)

檢視原始碼 (自 OTP 21.2 起)
-spec update_handler_config(HandlerId, level, Level) -> Return
                               when
                                   HandlerId :: logger_handler:id(),
                                   Level :: level() | all | none,
                                   Return :: ok | {error, term()};
                           (HandlerId, filter_default, FilterDefault) -> Return
                               when
                                   HandlerId :: logger_handler:id(),
                                   FilterDefault :: log | stop,
                                   Return :: ok | {error, term()};
                           (HandlerId, filters, Filters) -> Return
                               when
                                   HandlerId :: logger_handler:id(),
                                   Filters :: [{filter_id(), filter()}],
                                   Return :: ok | {error, term()};
                           (HandlerId, formatter, Formatter) -> Return
                               when
                                   HandlerId :: logger_handler:id(),
                                   Formatter :: {module(), formatter_config()},
                                   Return :: ok | {error, term()};
                           (HandlerId, config, Config) -> Return
                               when
                                   HandlerId :: logger_handler:id(),
                                   Config :: term(),
                                   Return :: ok | {error, term()}.

新增或更新指定處理常式的組態資料。如果給定的 Key 已存在,其關聯值將會變更為給定的值。如果不存在,則會新增。

如果值不完整,例如 config 鍵的情況,則由處理程式實作決定如何設定未指定的部份。對於 Kernel 應用程式中的所有處理程式,config 鍵的未指定資料不會變更。若要將未指定資料重設為預設值,請使用 set_handler_config/3

如需不同參數的詳細資訊,請參閱 logger_handler:config/0 類型的定義。

連結到此函式

update_primary_config(Config)

檢視原始碼 (自 OTP 21.0 起)
-spec update_primary_config(Config) -> ok | {error, term()} when Config :: primary_config().

更新 Logger 的主要配置資料。此函式的行為如同以下實作方式:

Old = logger:get_primary_config(),
logger:set_primary_config(maps:merge(Old, Config)).

若要覆寫現有的組態而不進行任何合併,請使用 set_primary_config/1

連結到此函式

update_process_metadata(Meta)

檢視原始碼 (自 OTP 21.0 起)
-spec update_process_metadata(Meta) -> ok when Meta :: metadata().

設定或更新從目前程序記錄時使用的中繼資料。

如果目前程序存在程序中繼資料,則此函數的行為如同以下實作

logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).

如果不存在程序中繼資料,則函數的行為如同 set_process_metadata/1

連結到此函式

update_proxy_config(Config)

檢視原始碼 (自 OTP 21.3 起)
-spec update_proxy_config(Config) -> ok | {error, term()} when Config :: olp_config().

更新 Logger 代理的配置資料。此函式的行為如同以下實作方式:

Old = logger:get_proxy_config(),
logger:set_proxy_config(maps:merge(Old, Config)).

若要覆寫現有的組態而不進行任何合併,請使用 set_proxy_config/1

如需 Proxy 的詳細資訊,請參閱 Kernel 使用者指南中的 記錄器 Proxy 一節。

其他 API 函數

連結到此函式

compare_levels(Level1, Level2)

檢視原始碼 (自 OTP 21.0 起)
-spec compare_levels(Level1, Level2) -> eq | gt | lt
                        when Level1 :: level() | all | none, Level2 :: level() | all | none.

比較兩個日誌等級的嚴重性。如果 Level1Level2 更嚴重,則傳回 gt;如果 Level1 不如 Level2 嚴重,則傳回 lt;如果等級相等,則傳回 eq

連結到此函式

format_report(Report)

檢視原始碼 (自 OTP 21.0 起)
-spec format_report(Report) -> FormatArgs when Report :: report(), FormatArgs :: {io:format(), [term()]}.

將報告形式的日誌訊息轉換為 {Format, Args}。這是 logger_formatter 在找不到自訂報告回呼時使用的預設報告回呼。如需關於報告回呼和有效日誌訊息形式的資訊,請參閱 Kernel 使用者指南中的 日誌訊息 一節。

此函數會從鍵值列表產生 鍵: 值 的行。字串會以 ~ts 列印,而其他術語則以 ~tp 列印。

如果 Report 是一個 map,則在格式化之前會將其轉換為鍵值列表。

連結到此函式

reconfigure()

檢視原始碼 (自 OTP 24.2 起)
-spec reconfigure() -> ok | {error, term()}.

使用在載入 kernel 應用程式後設定的更新 kernel 配置重新設定 Logger。

請注意,此功能僅供建置工具執行,而非在應用程式生命週期中手動執行,因為這可能會導致遺失日誌條目。

連結到此函式

timestamp()

檢視原始碼 (自 OTP 21.3 起)
-spec timestamp() -> timestamp().

傳回一個時間戳記,可作為日誌事件中繼資料中的 time 欄位插入。它是使用 os:system_time(microsecond) 產生的。

請注意,除非中繼資料中已存在時間戳記,否則 Logger 會自動插入時間戳記。此函數會匯出,以處理在發出日誌事件時,時間戳記必須在不同時間點擷取的少數情況。