2. alarm_handler
alarm handler 进程是一个用gen_event实现的事件处理进程,用来接收系统运行时发出的警告,erlang并不希望通过这个进程来处理所有的警告,相反,erlang鼓励用户实现自己的 alarm handler。在没有指定处理进程的情况下,erlang启动了一个简单的处理进程来处理系统警告。这个简单的处理进程,会将收到的所有警告信息,发送给error logger。这个简单的处理进程被注册为”alarm_handler”,如果你要更换为自己的处理模块,可以这样:
gen_event:swap_handler(alarm_handler, {alarm_handler, swap}, {NewHandler, Args}).
解释:gen_event:swap_handler(alarm_handler, {当前的处理进程名, 退出的原因(会被该gen_event的terminate接受)}, {仅的处理进程名, 新处理进程接受的参数}).
调用这个函数时,erlang将尝试去调用
NewHandler:init({Args, PreHandlerTerminateReturn).
第二个参数是:上一个处理进程terminate时返回的数据
下面是我写的一个例子,这个例子只适合第一次切换alarm handler,第二次时,init参数应该是 {Args, {ok, terminate_0}}即根据上一次terminate的结果
-module(alarm
).
-export([init
/1]).
-export([handle_call
/2,
handle_info
/2,
handle_event
/2,
terminate
/2,
code_change
/3]).
-behaviour(gen_event
).
init({Args, {alarm_handler
, Alarms}}) ->
;
io:
format("~w ~w ~n", [Args, Alarms]),
{ok
, ok
}.
handle_call(Info, State) ->
;
io:
format("~w ~n", [Info]),
{ok
, State}.
handle_info(Info, State) ->
;
io:
format("~w ~n", [Info]),
{ok
, State}.
handle_event(Info, State) ->
;
io:
format("~w ~n", [Info]),
{ok
, State}.
terminate(Reason, _State) ->
;
io:
format("terminate:~w ~n", [Reason]),
{ok
, terminate_0
}.
code_change(_, State, _) ->
;
{ok
, State}.