查看源码 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 的处理程序。
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>
将警告事件标记为 errors
或 info
,从而在日志中显示为 ERROR REPORT
或 INFO REPORT
。
事件
添加到错误记录器的所有事件处理程序必须处理以下事件。Gleader
是发送事件的进程的组长 pid,Pid
是发送事件的进程。
{error, Gleader, {Pid, Format, Data}}
- 当调用error_msg/1,2
或format/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
回调模块。
通过调用 gen_event:delete_handler(error_logger, Handler, [])
从错误记录器中删除一个事件处理程序。
记录一个标准错误事件。Format
和 Data
参数与 STDLIB 中 io:format/2
的参数相同。
记录一个标准错误事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
记录一个用户定义的错误事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
返回 max(10, Depth)
,其中 Depth
是 Kernel 应用程序中 error_logger_format_depth
的值(如果 Depth 是整数)。否则,返回 unlimited
。
记录一个标准信息事件。Format
和 Data
参数与 STDLIB 中 io:format/2
的参数相同。
记录一个标准信息事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
记录一个用户定义的信息事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
启用或禁用将标准事件打印到文件。
启用(Flag == true
)或禁用(Flag == false
)将标准事件打印到终端。
返回警告事件的当前映射。
记录一个标准警告事件。Format
和 Data
参数与 STDLIB 中 io:format/2
的参数相同。
记录一个标准警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
记录一个用户定义的警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
类型
函数
-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
进程将被启动。
-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().
记录一个标准错误事件。Format
和 Data
参数与 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 设备正确编码。
-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
记录一个用户定义的错误事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
错误日志记录器还会向此事件的元数据添加一个值为 [Type]
的 domain
字段,导致默认 Logger 处理程序的过滤器丢弃该事件。必须添加不同的 Logger 处理程序或错误日志记录器事件处理程序来处理此事件。
建议 Report
遵循与 error_report/1
相同的结构。
保留此函数是为了向后兼容,新代码不得使用它。请改用 ?LOG_ERROR
宏或 logger:error/1,2,3
。
-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, [])
。
记录一个标准信息事件。Format
和 Data
参数与 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
记录一个用户定义的信息事件。错误记录器将事件转发到 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,2
或 warning_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().
记录一个标准警告事件。Format
和 Data
参数与 STDLIB 中 io:format/2
的参数相同。
错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
该事件由默认的 Logger 处理程序处理。可以将日志级别更改为错误或信息,请参阅 warning_map/0
。
这些函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_WARNING
宏或 logger:warning/1,2,3
。
警告
如果在格式字符串中使用 Unicode 转换修饰符 (
t
),则所有事件处理程序都必须确保格式化的输出已为 I/O 设备正确编码。
-spec warning_report(Report) -> ok when Report :: report().
记录一个标准警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
该事件由默认的 Logger 处理程序处理。可以将日志级别更改为错误或信息,请参阅 warning_map/0
。
此函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_WARNING
宏或 logger:warning/1,2,3
。
记录一个用户定义的警告事件。错误记录器将事件转发到 Logger,包括允许与旧的错误记录器事件处理程序向后兼容的元数据。
错误日志记录器还会向此事件的元数据添加一个值为 [Type]
的 domain
字段,导致默认 Logger 处理程序的过滤器丢弃该事件。必须添加不同的 Logger 处理程序或错误日志记录器事件处理程序来处理此事件。
可以将日志级别更改为错误或信息,请参阅 warning_map/0
。
建议 Report
遵循与 warning_report/1
相同的结构。
此函数被保留是为了向后兼容,新代码不得使用。请改用 ?LOG_WARNING
宏或 logger:warning/1,2,3
。