查看源码 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(StringOrReport[,Metadata])
  • ?LOG_EMERGENCY(FunOrFormat,Args[,Metadata])
  • ?LOG_ALERT(StringOrReport[,Metadata])
  • ?LOG_ALERT(FunOrFormat,Args[,Metadata])
  • ?LOG_CRITICAL(StringOrReport[,Metadata])
  • ?LOG_CRITICAL(FunOrFormat,Args[,Metadata])
  • ?LOG_ERROR(StringOrReport[,Metadata])
  • ?LOG_ERROR(FunOrFormat,Args[,Metadata])
  • ?LOG_WARNING(StringOrReport[,Metadata])
  • ?LOG_WARNING(FunOrFormat,Args[,Metadata])
  • ?LOG_NOTICE(StringOrReport[,Metadata])
  • ?LOG_NOTICE(FunOrFormat,Args[,Metadata])
  • ?LOG_INFO(StringOrReport[,Metadata])
  • ?LOG_INFO(FunOrFormat,Args[,Metadata])
  • ?LOG_DEBUG(StringOrReport[,Metadata])
  • ?LOG_DEBUG(FunOrFormat,Args[,Metadata])
  • ?LOG(Level,StringOrReport[,Metadata])
  • ?LOG(Level,FunOrFormat,Args[,Metadata])

所有宏都扩展为对 Logger 的调用,其中 Level 取自宏名称,或者在 ?LOG 宏的情况下取自第一个参数。位置数据将添加到元数据中,如 metadata/0 类型定义中所述。

该调用包装在 case 语句中,并且只有在 Level 等于或低于配置的日志级别时才会执行。

另请参阅

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 配置,包括主配置、处理程序配置、代理配置和模块级设置。

查找所有处理程序的当前配置。

查找给定处理程序的当前配置。

查找所有已安装处理程序的标识。

查找所有当前的模块级别。返回一个列表,其中包含之前使用 set_module_level/2 设置模块级别的每个模块的 {Module,Level} 元素。

查找给定模块的当前级别。返回一个列表,其中包含之前使用 set_module_level/2 设置模块级别的每个给定模块的 {Module,Level} 元素。

查找 Logger 的当前主配置。

查找 Logger 代理的当前配置。

i()

漂亮地打印所有 Logger 配置。

漂亮地打印 Logger 配置。

删除由 HandlerId 标识的处理程序。

从由 HandlerId 标识的处理程序中删除由 FilterId 标识的过滤器。

从 Logger 中移除由 FilterId 标识的主过滤器。

为指定应用程序的所有模块设置日志级别。

为指定的处理程序设置配置数据。这将覆盖当前的处理程序配置。

为指定的处理程序添加或更新配置数据。如果给定的 Key 已经存在,则其关联的值将被更改为给定的值。如果不存在,则会添加它。

为指定的模块设置日志级别。

为 Logger 设置主配置数据。这将覆盖当前的配置。

为 Logger 添加或更新主配置数据。如果给定的 Key 已经存在,则其关联的值将被更改为给定的值。如果不存在,则会添加它。

设置 Logger 应自动插入到当前进程生成的所有日志事件中的元数据。

为 Logger 代理设置配置数据。这将覆盖当前的代理配置。未在 Config 映射中指定的键将获得默认值。

取消设置指定应用程序的所有模块的日志级别。

移除模块特定的日志设置。此操作之后,所有模块都将使用主日志级别。

移除模块特定的日志设置。此操作之后,指定的模块将使用主日志级别。

更新指定处理程序的格式化程序配置。

更新指定处理程序的配置数据。此函数的行为方式如同以下实现

为指定的处理程序添加或更新配置数据。如果给定的 Key 已经存在,则其关联的值将被更改为给定的值。如果不存在,则会添加它。

更新 Logger 的主配置数据。此函数的行为方式如同以下实现

设置或更新从当前进程记录日志时使用的元数据。

更新 Logger 代理的配置数据。此函数的行为方式如同以下实现

其他 API 函数

比较两个日志级别的严重性。如果 Level1Level2 更严重,则返回 gt;如果 Level1Level2 不严重,则返回 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 (报告回调)相关联。有关报告回调的更多信息,请参阅 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(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec alert(String :: unicode:chardata()) -> ok;
           (Report :: report()) -> ok.

等效于 alert(StringOrReport, #{})

链接到此函数

alert(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, Args, Metadata)

链接到此函数

critical(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec critical(String :: unicode:chardata()) -> ok;
              (Report :: report()) -> ok.

等效于 critical(StringOrReport, #{})

链接到此函数

critical(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, Args, Metadata)

链接到此函数

debug(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec debug(String :: unicode:chardata()) -> ok;
           (Report :: report()) -> ok.

等效于 debug(StringOrReport, #{})

链接到此函数

debug(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, Args, Metadata)

链接到此函数

emergency(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec emergency(String :: unicode:chardata()) -> ok;
               (Report :: report()) -> ok.

等效于 emergency(StringOrReport, #{})

链接到此函数

emergency(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, Args, Metadata)

链接到此函数

error(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec error(String :: unicode:chardata()) -> ok;
           (Report :: report()) -> ok.

等效于 error(StringOrReport, #{})

链接到此函数

error(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, Args, Metadata)

链接到此函数

info(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec info(String :: unicode:chardata()) -> ok;
          (Report :: report()) -> ok.

等效于 info(StringOrReport, #{})

链接到此函数

info(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, Args, Metadata)

链接到此函数

log(Level, StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec log(Level :: level(), String :: unicode:chardata()) -> ok;
         (Level :: level(), Report :: report()) -> ok.

等效于 log(Level, StringOrReport, #{})

链接到此函数

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(Level, FunOrFormat, 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.

在给定的日志级别创建日志事件,其中包含要记录的给定消息元数据

消息和元数据可以直接在参数中给出,也可以从函数返回。当消息/元数据的计算成本非常高时,传递一个函数而不是直接传递消息/元数据会很有用。这是因为只有在实际需要消息/元数据时才会评估该函数,如果日志事件不被记录,则可能根本不会评估。示例

%% 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(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec notice(String :: unicode:chardata()) -> ok;
            (Report :: report()) -> ok.

等效于 notice(StringOrReport, #{})

链接到此函数

notice(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, Args, Metadata)

链接到此函数

warning(StringOrReport)

查看源代码 (自 OTP 21.0 起)
-spec warning(String :: unicode:chardata()) -> ok;
             (Report :: report()) -> ok.

等效于 warning(StringOrReport, #{})

链接到此函数

warning(FormatOrFun, 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(FormatOrFun, 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, FormatOrFun, 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_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 处理程序应使用此函数来使配置保持一致,无论系统使用哪个处理程序。通常的用法是在启动处理程序需要的进程后立即调用 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 配置参数,并启动配置的处理程序。配置的内容使用与 logger 处理程序配置 相同的规则。

如果处理程序旨在替换默认处理程序,则必须先禁用 Kernel 的默认处理程序,然后再添加新的处理程序。禁用 Kernel 处理程序并添加自定义处理程序的 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_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 配置,包括主配置、处理程序配置、代理配置和模块级设置。

链接到此函数

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 代理的当前配置。

有关代理的更多信息,请参阅内核用户指南中的 Logger 代理 部分。

链接到此函数

i()

查看源码 (自 OTP 21.3 起)
-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

使用此配置,将不会记录任何 debug 消息,因为它们都被主日志级别阻止。

如果现在将 mymodule 的级别设置为 debug,则此模块的 debug 事件将由处理程序 h2 记录,但不会由处理程序 h1 记录。

来自其他模块的 Debug 事件仍然不会被记录。

要更改 Logger 的主日志级别,请使用 set_primary_config(level, Level)

要更改处理程序的日志级别,请使用 set_handler_config(HandlerId, level, Level)

注意

仅当元数据中存在键 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 函数或宏)参数提供的元数据与进程元数据合并。如果出现相同的键,则来自日志调用的元数据参数的值将覆盖来自进程元数据的值,进程元数据的值又覆盖来自位置数据的值。

后续对此函数的调用会覆盖先前设置的数据。要更新现有数据而不是覆盖它,请参阅 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 读取当前配置,然后在用此函数写回新配置之前进行合并。

有关代理的更多信息,请参阅内核用户指南中的 Logger 代理 部分。

链接到此函数

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 键的情况,则由处理程序实现决定如何设置未指定的部分。对于内核应用程序中的所有处理程序,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

有关代理的更多信息,请参阅内核用户指南中的 Logger 代理 部分。

杂项 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;如果 Level1Level2 不严重,则返回 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 用户指南中的日志消息部分。

该函数从键值列表中生成 Key: Value 行。字符串使用 ~ts 打印,其他项使用 ~tp 打印。

如果 Report 是一个映射,则在格式化之前将其转换为键值列表。

链接到此函数

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 会自动在元数据中插入时间戳,除非它已存在。导出此函数是为了在极少数情况下,时间戳必须在发出日志事件的不同时间点获取。