查看源码 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 工具的概述,请参阅 用户指南。
- 如何配置 Logger,请参阅用户指南中的 配置 部分。
- 内置处理程序,请参阅
logger_std_h
和logger_disk_log_h
。 - 内置格式化程序,请参阅
logger_formatter
。 - 内置过滤器,请参阅
logger_filters
。
宏
以下宏在 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 代理的当前配置。
漂亮地打印所有 Logger 配置。
漂亮地打印 Logger 配置。
删除由 HandlerId
标识的处理程序。
从由 HandlerId
标识的处理程序中删除由 FilterId
标识的过滤器。
从 Logger 中移除由 FilterId
标识的主过滤器。
为指定应用程序的所有模块设置日志级别。
为指定的处理程序设置配置数据。这将覆盖当前的处理程序配置。
为指定的处理程序添加或更新配置数据。如果给定的 Key
已经存在,则其关联的值将被更改为给定的值。如果不存在,则会添加它。
为指定的模块设置日志级别。
为 Logger 设置主配置数据。这将覆盖当前的配置。
为 Logger 添加或更新主配置数据。如果给定的 Key
已经存在,则其关联的值将被更改为给定的值。如果不存在,则会添加它。
设置 Logger 应自动插入到当前进程生成的所有日志事件中的元数据。
为 Logger 代理设置配置数据。这将覆盖当前的代理配置。未在 Config
映射中指定的键将获得默认值。
取消设置指定应用程序的所有模块的日志级别。
移除模块特定的日志设置。此操作之后,所有模块都将使用主日志级别。
移除模块特定的日志设置。此操作之后,指定的模块将使用主日志级别。
更新指定处理程序的格式化程序配置。
更新指定处理程序的配置数据。此函数的行为方式如同以下实现
为指定的处理程序添加或更新配置数据。如果给定的 Key
已经存在,则其关联的值将被更改为给定的值。如果不存在,则会添加它。
更新 Logger 的主配置数据。此函数的行为方式如同以下实现
设置或更新从当前进程记录日志时使用的元数据。
更新 Logger 代理的配置数据。此函数的行为方式如同以下实现
其他 API 函数
比较两个日志级别的严重性。如果 Level1
比 Level2
更严重,则返回 gt
;如果 Level1
比 Level2
不严重,则返回 lt
;如果级别相等,则返回 eq
。
将报告形式的日志消息转换为 {Format, Args}
。这是 logger_formatter
在未找到自定义报告回调时使用的默认报告回调。有关报告回调和日志消息的有效形式的信息,请参阅 Kernel 用户指南中的日志消息部分。
使用 kernel
应用程序加载后设置的更新的 kernel
配置重新配置 Logger。
返回一个时间戳,该时间戳可以作为日志事件的元数据中的 time
字段插入。它通过 os:system_time(microsecond)
生成。
类型
-type config_handler() :: {handler, logger_handler:id(), module(), logger_handler:config()}.
添加或更新处理程序时使用的配置。
-type filter() :: {fun((log_event(), filter_arg()) -> filter_return()), filter_arg()}.
可以作为处理程序过滤器安装或作为 Logger 中的主过滤器的过滤器。
-type filter_arg() :: term().
过滤器函数的第二个参数。
-type filter_id() :: atom().
过滤器的唯一标识符。
-type filter_return() :: stop | ignore | log_event().
来自过滤器函数的返回值。
格式化程序的配置数据。有关格式化程序实现的示例,请参阅 logger_formatter
。
-type handler_config() :: logger_handler:config().
Logger 的处理程序配置数据。
注意
已弃用:请改用
logger_handler:config/0
。
-type handler_id() :: logger_handler:id().
处理程序实例的唯一标识符。
注意
已弃用:请改用
logger_handler:id/0
。
-type level() :: emergency | alert | critical | error | warning | notice | info | debug.
要记录的消息的严重级别。
-type log_event() :: #{level := level(), msg := {io:format(), [term()]} | {report, report()} | {string, unicode:chardata()}, meta := metadata()}.
传递给过滤器和处理程序的日志事件
-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 API 函数的最后一个参数。
- 使用
set_process_metadata/1
或update_process_metadata/1
设置进程元数据。 - 使用
set_primary_config/1
或通过内核配置参数 logger_metadata 设置主元数据。
注意
添加自定义元数据时,请确保不要使用上述任何键,因为这可能会导致日志事件出现很多混淆。
Logger 在将日志事件转发到处理程序之前,会合并所有元数据映射。如果出现相同的键,则日志调用中的值会覆盖进程元数据,进程元数据会覆盖主元数据,而主元数据又会覆盖 Logger 设置的值。
以下自定义元数据键具有特殊含义
domain
- 此键关联的值由过滤器用于对源自特定功能区域的日志事件进行分组。有关如何使用此字段的说明,请参阅logger_filters:domain/2
。report_cb
- 如果日志消息被指定为report/0
,则report_cb
键可以与将报告转换为格式字符串和参数或直接转换为字符串的 fun (报告回调)相关联。有关报告回调的更多信息,请参阅report_cb/0
的类型定义和用户指南中的日志消息部分。
-type msg_fun() :: fun((term()) -> msg_fun_return() | {msg_fun_return(), metadata()}).
-type msg_fun_return() :: {io:format(), [term()]} | report() | unicode:chardata() | ignore.
-type olp_config() :: logger_handler:olp_config().
过载保护配置。
注意
已弃用:请改用
logger_handler:olp_config/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 => []
日志报告。
-type report_cb() :: fun((report()) -> {io:format(), [term()]}) | fun((report(), report_cb_config()) -> unicode:chardata()).
将 report()
转换为格式字符串和参数,或直接转换为字符串的函数。
有关更多信息,请参阅用户指南中的日志消息部分。
-type report_cb_config() :: #{depth := pos_integer() | unlimited, chars_limit := pos_integer() | unlimited, single_line := boolean()}.
-type timestamp() :: integer().
使用 logger:timestamp()
生成的时间戳。
日志 API 函数
-spec alert(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
-spec critical(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
-spec debug(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
-spec emergency(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
-spec error(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
-spec info(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
-spec log(Level :: level(), String :: unicode:chardata()) -> ok; (Level :: level(), Report :: report()) -> ok.
-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, #{})
。
-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 }).
当元数据既作为参数给出又从函数返回时,它们会合并。如果存在相同的键,则值取自函数返回的元数据。
-spec notice(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
-spec warning(String :: unicode:chardata()) -> ok; (Report :: report()) -> ok.
-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, #{})
。
配置 API 函数
-spec add_handler(HandlerId, Module, Config) -> ok | {error, term()} when HandlerId :: logger_handler:id(), Module :: module(), Config :: logger_handler:config().
添加具有给定配置的处理程序。
HandlerId
是一个唯一的标识符,必须在所有后续调用中用于引用此处理程序。
-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
中定义。
-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, #{}}]}]}].
-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
中定义。
-spec get_config() -> #{primary => primary_config(), handlers => [logger_handler:config()], proxy => olp_config(), module_levels => [{module(), level() | all | none}]}.
查找所有当前的 Logger 配置,包括主配置、处理程序配置、代理配置和模块级设置。
-spec get_handler_config() -> [Config] when Config :: logger_handler:config().
查找所有处理程序的当前配置。
-spec get_handler_config(HandlerId) -> {ok, Config} | {error, term()} when HandlerId :: logger_handler:id(), Config :: logger_handler:config().
查找给定处理程序的当前配置。
-spec get_handler_ids() -> [HandlerId] when HandlerId :: logger_handler:id().
查找所有已安装处理程序的标识。
-spec get_module_level() -> [{Module, Level}] when Module :: module(), Level :: level() | all | none.
查找所有当前的模块级别。返回一个列表,其中包含之前使用 set_module_level/2
设置模块级别的每个模块的 {Module,Level}
元素。
-spec get_module_level(Modules) -> [{Module, Level}] when Modules :: [Module] | Module, Module :: module(), Level :: level() | all | none.
查找给定模块的当前级别。返回一个列表,其中包含之前使用 set_module_level/2
设置模块级别的每个给定模块的 {Module,Level}
元素。
-spec get_primary_config() -> Config when Config :: primary_config().
查找 Logger 的当前主配置。
-spec get_process_metadata() -> Meta | undefined when Meta :: metadata().
检索使用 set_process_metadata/1
或 update_process_metadata/1
设置的数据。
-spec get_proxy_config() -> Config when Config :: olp_config().
查找 Logger 代理的当前配置。
有关代理的更多信息,请参阅内核用户指南中的 Logger 代理 部分。
-spec i() -> ok.
漂亮地打印所有 Logger 配置。
-spec i(What) -> ok when What :: primary | handlers | proxy | modules | logger_handler:id().
漂亮地打印 Logger 配置。
-spec remove_handler(HandlerId) -> ok | {error, term()} when HandlerId :: logger_handler:id().
删除由 HandlerId
标识的处理程序。
-spec remove_handler_filter(HandlerId, FilterId) -> ok | {error, term()} when HandlerId :: logger_handler:id(), FilterId :: filter_id().
从由 HandlerId
标识的处理程序中删除由 FilterId
标识的过滤器。
从 Logger 中移除由 FilterId
标识的主过滤器。
-spec set_application_level(Application, Level) -> ok | {error, not_loaded} when Application :: atom(), Level :: level() | all | none.
为指定应用程序的所有模块设置日志级别。
此函数是一个便利函数,它为与应用程序关联的每个模块调用 logger:set_module_level/2。
-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 知道该键,则将使用默认值。如果它是自定义键,则取决于处理程序实现是否删除该值或插入默认值。
-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
类型的定义。
-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 函数而不使用宏,则日志客户端必须显式添加此信息,模块级别才能生效。
-spec set_primary_config(Config) -> ok | {error, term()} when Config :: primary_config().
为 Logger 设置主配置数据。这将覆盖当前的配置。
要修改现有配置,请使用 update_primary_config/1
,或者,如果需要更复杂的合并,请使用 get_primary_config/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 中添加的。
-spec set_process_metadata(Meta) -> ok when Meta :: metadata().
设置 Logger 应自动插入到当前进程生成的所有日志事件中的元数据。
日志宏生成的位置数据和/或作为日志调用(API 函数或宏)参数提供的元数据与进程元数据合并。如果出现相同的键,则来自日志调用的元数据参数的值将覆盖来自进程元数据的值,进程元数据的值又覆盖来自位置数据的值。
后续对此函数的调用会覆盖先前设置的数据。要更新现有数据而不是覆盖它,请参阅 update_process_metadata/1
。
-spec set_proxy_config(Config) -> ok | {error, term()} when Config :: olp_config().
为 Logger 代理设置配置数据。这将覆盖当前的代理配置。未在 Config
映射中指定的键将获得默认值。
要修改现有配置,请使用 update_proxy_config/1
,或者,如果需要更复杂的合并,请使用 get_proxy_config/0
读取当前配置,然后在用此函数写回新配置之前进行合并。
有关代理的更多信息,请参阅内核用户指南中的 Logger 代理 部分。
-spec unset_application_level(Application) -> ok | {error, {not_loaded, Application}} when Application :: atom().
取消设置指定应用程序的所有模块的日志级别。
此函数是一个实用程序函数,它为与应用程序关联的每个模块调用 logger:unset_module_level/2。
-spec unset_module_level() -> ok.
移除模块特定的日志设置。此操作之后,所有模块都将使用主日志级别。
移除模块特定的日志设置。此操作之后,指定的模块将使用主日志级别。
-spec unset_process_metadata() -> ok.
删除通过 set_process_metadata/1
或 update_process_metadata/1
设置的数据。
-spec update_formatter_config(HandlerId, FormatterConfig) -> ok | {error, term()} when HandlerId :: logger_handler:id(), FormatterConfig :: formatter_config().
更新指定处理程序的格式化程序配置。
新配置与现有的格式化程序配置合并。
要在没有任何合并的情况下覆盖现有配置,请使用
set_handler_config(HandlerId, formatter,
{FormatterModule, FormatterConfig}).
-spec update_formatter_config(HandlerId, Key, Value) -> ok | {error, term()} when HandlerId :: logger_handler:id(), Key :: atom(), Value :: term().
-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
。
-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
类型的定义。
-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
。
-spec update_process_metadata(Meta) -> ok when Meta :: metadata().
设置或更新从当前进程记录日志时使用的元数据。
如果当前进程存在进程元数据,则此函数的行为方式如同以下实现方式
logger:set_process_metadata(maps:merge(logger:get_process_metadata(), Meta)).
如果不存在进程元数据,则该函数的行为与 set_process_metadata/1
相同。
-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 函数
-spec compare_levels(Level1, Level2) -> eq | gt | lt when Level1 :: level() | all | none, Level2 :: level() | all | none.
比较两个日志级别的严重性。如果 Level1
比 Level2
更严重,则返回 gt
;如果 Level1
比 Level2
不严重,则返回 lt
;如果级别相等,则返回 eq
。
-spec format_report(Report) -> FormatArgs when Report :: report(), FormatArgs :: {io:format(), [term()]}.
将报告形式的日志消息转换为 {Format, Args}
。这是 logger_formatter
在未找到自定义报告回调时使用的默认报告回调。有关报告回调和日志消息的有效形式的信息,请参阅 Kernel 用户指南中的日志消息部分。
该函数从键值列表中生成 Key: Value
行。字符串使用 ~ts
打印,其他项使用 ~tp
打印。
如果 Report
是一个映射,则在格式化之前将其转换为键值列表。
-spec reconfigure() -> ok | {error, term()}.
使用 kernel
应用程序加载后设置的更新的 kernel
配置重新配置 Logger。
请注意,这仅供构建工具运行,而不是在应用程序生命周期中手动运行,因为这可能会导致日志条目丢失。
-spec timestamp() -> timestamp().
返回一个时间戳,该时间戳可以作为日志事件的元数据中的 time
字段插入。它通过 os:system_time(microsecond)
生成。
请注意,Logger 会自动在元数据中插入时间戳,除非它已存在。导出此函数是为了在极少数情况下,时间戳必须在发出日志事件的不同时间点获取。