查看源码 error_logger (kernel v10.2)

Erlang 错误记录器。

注意

在 Erlang/OTP 21.0 中,添加了一个新的日志记录 API。旧的 error_logger 模块仍然可以被遗留代码使用,但日志事件会被重定向到新的 Logger API。新代码应直接使用 Logger API。

error_logger 默认不再启动,但是当使用 error_logger:add_report_handler/1,2 添加事件处理程序时会自动启动。error_logger 模块也会被添加为新 logger 的处理程序。

有关详细信息,请参阅 logger 和用户指南中的日志记录章节。

Erlang *错误记录器*是一个事件管理器(请参阅OTP 设计原则gen_event),注册为error_logger

错误记录器默认不再启动,但是当使用add_report_handler/1,2添加事件处理程序时会自动启动。error_logger模块也会被添加为新logger的处理程序,导致日志事件从logger转发到错误记录器,并因此转发到所有已安装的错误记录器事件处理程序。

可以添加用户定义的事件处理程序来处理特定于应用程序的事件。

STDLIB 和 SASL 提供的现有事件处理程序仍然可用,但 OTP 不再使用它们。

警告事件在 Erlang/OTP R9C 中引入,并从 Erlang/OTP 18.0 开始默认启用。为了保留与现有用户定义事件处理程序的向后兼容性,可以使用命令行标志 +W <e | i | w> 将警告事件标记为 errorsinfo,从而在日志中显示为 ERROR REPORTINFO REPORT

事件

添加到错误记录器的所有事件处理程序必须处理以下事件。Gleader 是发送事件的进程的组长 pid,Pid 是发送事件的进程。

  • {error, Gleader, {Pid, Format, Data}} - 当调用 error_msg/1,2format/2 时生成。

  • {error_report, Gleader, {Pid, std_error, Report}} - 当调用 error_report/1 时生成。

  • {error_report, Gleader, {Pid, Type, Report}} - 当调用 error_report/2 时生成。

  • {warning_msg, Gleader, {Pid, Format, Data}} - 如果警告设置为标记为警告,则当调用 warning_msg/1,2 时生成。

  • {warning_report, Gleader, {Pid, std_warning, Report}} - 如果警告设置为标记为警告,则当调用 warning_report/1 时生成。

  • {warning_report, Gleader, {Pid, Type, Report}} - 如果警告设置为标记为警告,则当调用 warning_report/2 时生成。

  • {info_msg, Gleader, {Pid, Format, Data}} - 当调用 info_msg/1,2 时生成。

  • {info_report, Gleader, {Pid, std_info, Report}} - 当调用 info_report/1 时生成。

  • {info_report, Gleader, {Pid, Type, Report}} - 当调用 info_report/2 时生成。

请注意,还会收到一些系统内部事件。因此,必须在事件处理程序回调函数 gen_event:handle_event/2 的定义中使用一个捕获所有子句放在最后。这也适用于 gen_event:handle_info/2,因为事件处理程序还必须处理一些系统内部消息。

另请参阅

gen_event, logger, log_mf_h, kernel, sasl

概要

函数

向错误记录器添加新的事件处理程序。事件处理程序必须实现为 gen_event 回调模块。

通过调用 gen_event:delete_handler(error_logger, Handler, []) 从错误记录器中删除一个事件处理程序。

记录一个标准错误事件。FormatData 参数与 STDLIB 中 io:format/2 的参数相同。

记录一个标准错误事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

记录一个用户定义的错误事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

返回 max(10, Depth),其中 Depth 是 Kernel 应用程序中 error_logger_format_depth 的值(如果 Depth 是整数)。否则,返回 unlimited

记录一个标准信息事件。FormatData 参数与 STDLIB 中 io:format/2 的参数相同。

记录一个标准信息事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

记录一个用户定义的信息事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

启用或禁用将标准事件打印到文件。

启用(Flag == true)或禁用(Flag == false)将标准事件打印到终端。

返回警告事件的当前映射。

记录一个标准警告事件。FormatData 参数与 STDLIB 中 io:format/2 的参数相同。

记录一个标准警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

记录一个用户定义的警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

类型

链接到此类型

open_error()

查看源码 (未导出)
-type open_error() :: file:posix() | badarg | system_limit.
链接到此类型

report()

查看源码 (未导出)
-type report() :: [{Tag :: term(), Data :: term()} | term()] | string() | term().

函数

链接到此函数

add_report_handler(Handler)

查看源码
-spec add_report_handler(Handler) -> any() when Handler :: module().

等效于 add_report_handler(Handler, [])

链接到此函数

add_report_handler(Handler, Args)

查看源码
-spec add_report_handler(Handler, Args) -> Result
                            when
                                Handler :: module(),
                                Args :: gen_event:handler_args(),
                                Result :: gen_event:add_handler_ret().

向错误记录器添加新的事件处理程序。事件处理程序必须实现为 gen_event 回调模块。

Handler 通常是回调模块的名称,而 Args 是传递给初始化回调函数 gen_event:init/1 的可选项(默认为 [])。如果成功,该函数返回 ok

事件处理程序必须能够处理此模块中的事件,请参阅事件部分。

第一次调用此函数时,error_logger 将被添加为 Logger 处理程序,并且 error_logger 进程将被启动。

链接到此函数

delete_report_handler(Handler)

查看源码
-spec delete_report_handler(Handler) -> Result
                               when Handler :: module(), Result :: gen_event:del_handler_ret().

通过调用 gen_event:delete_handler(error_logger, Handler, []) 从错误记录器中删除一个事件处理程序。

如果在删除后不再有事件处理程序,则 error_logger 将被从 Logger 处理程序中删除,并且 error_logger 进程将被停止。

-spec error_msg(Format) -> ok when Format :: string().

等效于 error_msg(Format, [])

链接到此函数

error_msg(Format, Data)

查看源码
-spec error_msg(Format, Data) -> ok when Format :: string(), Data :: list().

记录一个标准错误事件。FormatData 参数与 STDLIB 中 io:format/2 的参数相同。

错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

该事件由默认的 Logger 处理程序处理。

保留此函数是为了向后兼容,新代码不得使用它。请改用 ?LOG_ERROR 宏或 logger:error/1,2,3

示例

1> error_logger:error_msg("An error occurred in ~p", [a_module]).
=ERROR REPORT==== 22-May-2018::11:18:43.376917 ===
An error occurred in a_module
ok

警告

如果在格式字符串中使用 Unicode 转换修饰符 (t),则所有事件处理程序都必须确保格式化的输出已为 I/O 设备正确编码。

链接到此函数

error_report(Report)

查看源码
-spec error_report(Report) -> ok when Report :: report().

记录一个标准错误事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

该事件由默认的 Logger 处理程序处理。

保留此函数是为了向后兼容,新代码不得使用它。请改用 ?LOG_ERROR 宏或 logger:error/1,2,3

示例

2> error_logger:error_report([{tag1,data1},a_term,{tag2,data}]).
=ERROR REPORT==== 22-May-2018::11:24:23.699306 ===
    tag1: data1
    a_term
    tag2: data
ok
3> error_logger:error_report("Serious error in my module").
=ERROR REPORT==== 22-May-2018::11:24:45.972445 ===
Serious error in my module
ok
链接到此函数

error_report(Type, Report)

查看源码
-spec error_report(Type, Report) -> ok when Type :: term(), Report :: report().

记录一个用户定义的错误事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

错误日志记录器还会向此事件的元数据添加一个值为 [Type]domain 字段,导致默认 Logger 处理程序的过滤器丢弃该事件。必须添加不同的 Logger 处理程序或错误日志记录器事件处理程序来处理此事件。

建议 Report 遵循与 error_report/1 相同的结构。

保留此函数是为了向后兼容,新代码不得使用它。请改用 ?LOG_ERROR 宏或 logger:error/1,2,3

链接到此函数

format(Format, Data)

查看源码
-spec format(Format, Data) -> ok when Format :: string(), Data :: list().

等效于 error_msg(Format, Data)

链接到此函数

get_format_depth()

查看源代码 (自 OTP 20.0 起)
-spec get_format_depth() -> unlimited | pos_integer().

返回 max(10, Depth),其中 Depth 是 Kernel 应用程序中 error_logger_format_depth 的值(如果 Depth 是整数)。否则,返回 unlimited

注意

自 Erlang/OTP 21.0 中引入 Logger API 后,error_logger_format_depth 变量已弃用。该变量和此函数被保留是为了向后兼容,因为它们仍然可能被旧的报告处理程序使用。

-spec info_msg(Format) -> ok when Format :: string().

等效于 info_msg(Format, [])

链接到此函数

info_msg(Format, Data)

查看源码
-spec info_msg(Format, Data) -> ok when Format :: string(), Data :: list().

记录一个标准信息事件。FormatData 参数与 STDLIB 中 io:format/2 的参数相同。

错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

该事件由默认的 Logger 处理程序处理。

这些函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_INFO 宏或 logger:info/1,2,3

示例

1> error_logger:info_msg("Something happened in ~p", [a_module]).
=INFO REPORT==== 22-May-2018::12:03:32.612462 ===
Something happened in a_module
ok

警告

如果在格式字符串中使用 Unicode 转换修饰符 (t),则所有事件处理程序都必须确保格式化的输出已为 I/O 设备正确编码。

-spec info_report(Report) -> ok when Report :: report().

记录一个标准信息事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

该事件由默认的 Logger 处理程序处理。

此函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_INFO 宏或 logger:info/1,2,3

示例

2> error_logger:info_report([{tag1,data1},a_term,{tag2,data}]).
=INFO REPORT==== 22-May-2018::12:06:35.994440 ===
    tag1: data1
    a_term
    tag2: data
ok
3> error_logger:info_report("Something strange happened").
=INFO REPORT==== 22-May-2018::12:06:49.066872 ===
Something strange happened
ok
链接到此函数

info_report(Type, Report)

查看源码
-spec info_report(Type, Report) -> ok when Type :: any(), Report :: report().

记录一个用户定义的信息事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

错误日志记录器还会向此事件的元数据添加一个值为 [Type]domain 字段,导致默认 Logger 处理程序的过滤器丢弃该事件。必须添加不同的 Logger 处理程序或错误日志记录器事件处理程序来处理此事件。

建议 Report 遵循与 info_report/1 相同的结构。

此函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_INFO 宏或 logger:info/1,2,3

-spec logfile(Request :: {open, Filename}) -> ok | {error, OpenReason}
                 when Filename :: file:name(), OpenReason :: allready_have_logfile | open_error();
             (Request :: close) -> ok | {error, CloseReason} when CloseReason :: module_not_found;
             (Request :: filename) -> Filename | {error, FilenameReason}
                 when Filename :: file:name(), FilenameReason :: no_log_file.

启用或禁用将标准事件打印到文件。

这是通过添加或删除 error_logger_file_h 事件处理程序来完成的,从而间接地将 error_logger 添加为 Logger 处理程序。

请注意,此函数不会直接操作 Logger 配置,这意味着如果默认 Logger 处理程序已经在写入文件,则此函数可能会导致写入第二个文件。

此函数在开发和测试期间可以用作快捷方式,但不应在生产系统中使用。有关如何为实时系统配置 Logger 的信息,请参阅 Kernel 用户指南中的 日志记录 部分,以及 logger 手册页。

Request 是以下之一

  • {open, Filename} - 打开日志文件 Filename。如果成功,则返回 ok;如果已启用写入文件,则返回 {error, allready_have_logfile};如果发生其他错误(例如,无法打开 Filename),则返回错误元组。该文件以 UTF-8 编码打开。

  • close - 关闭当前的日志文件。返回 ok,或 {error, module_not_found}

  • filename - 返回日志文件 Filename 的名称,如果未启用写入文件,则返回 {error, no_log_file}

-spec tty(Flag) -> ok when Flag :: boolean().

启用(Flag == true)或禁用(Flag == false)将标准事件打印到终端。

这是通过操作 Logger 配置来完成的。此函数在开发和测试期间可以用作快捷方式,但不应在生产系统中使用。有关如何为实时系统配置 Logger 的信息,请参阅 Kernel 用户指南中的 日志记录 部分,以及 logger 手册页。

-spec warning_map() -> Tag when Tag :: error | warning | info.

返回警告事件的当前映射。

使用 warning_msg/1,2warning_report/1,2 发送的事件会根据命令行标志 +W 的值标记为错误、警告(默认)或信息。

示例

os$ erl
Erlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]

Eshell V5.4.8  (abort with ^G)
1> error_logger:warning_map().
warning
2> error_logger:warning_msg("Warnings tagged as: ~p~n", [warning]).

=WARNING REPORT==== 11-Aug-2005::15:31:55 ===
Warnings tagged as: warning
ok
3>
User switch command
 --> q
os$ erl +W e
Erlang (BEAM) emulator version 5.4.8 [hipe] [threads:0] [kernel-poll]

Eshell V5.4.8  (abort with ^G)
1> error_logger:warning_map().
error
2> error_logger:warning_msg("Warnings tagged as: ~p~n", [error]).

=ERROR REPORT==== 11-Aug-2005::15:31:23 ===
Warnings tagged as: error
ok
-spec warning_msg(Format) -> ok when Format :: string().

等效于 warning_msg(Format, [])

链接到此函数

warning_msg(Format, Data)

查看源码
-spec warning_msg(Format, Data) -> ok when Format :: string(), Data :: list().

记录一个标准警告事件。FormatData 参数与 STDLIB 中 io:format/2 的参数相同。

错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

该事件由默认的 Logger 处理程序处理。可以将日志级别更改为错误或信息,请参阅 warning_map/0

这些函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_WARNING 宏或 logger:warning/1,2,3

警告

如果在格式字符串中使用 Unicode 转换修饰符 (t),则所有事件处理程序都必须确保格式化的输出已为 I/O 设备正确编码。

链接到此函数

warning_report(Report)

查看源码
-spec warning_report(Report) -> ok when Report :: report().

记录一个标准警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

该事件由默认的 Logger 处理程序处理。可以将日志级别更改为错误或信息,请参阅 warning_map/0

此函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_WARNING 宏或 logger:warning/1,2,3

链接到此函数

warning_report(Type, Report)

查看源码
-spec warning_report(Type, Report) -> ok when Type :: any(), Report :: report().

记录一个用户定义的警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。

错误日志记录器还会向此事件的元数据添加一个值为 [Type]domain 字段,导致默认 Logger 处理程序的过滤器丢弃该事件。必须添加不同的 Logger 处理程序或错误日志记录器事件处理程序来处理此事件。

可以将日志级别更改为错误或信息,请参阅 warning_map/0

建议 Report 遵循与 warning_report/1 相同的结构。

此函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_WARNING 宏或 logger:warning/1,2,3