gen_event behaviour随心记录

OTP中,事件管理器(event manager)用来接收事件,这里的事件非常广泛,可以为错误,警告各种各样erlang允许的信息。
事件管理器拥有零个或多个事件处理器(event handler)。当事件管理器收到一个事件时,此事件会被管理器内部安装的所有处理器处理。
其实在事件管理器(gen_event behaviour)中,拥有一个[{Module, State}],其保存安装的处理器(Module模块)及对应的状态。当收到事件时,管理器遍历调用Module的
Module:handle_event/2函数进行处理。
callbacks接口
1. init(InitArg)
处理器安装后,进行初始化,返回Module对应的状态
2. handle_event(Event, State)
处理各种event
3. handle_call(Request, State)
处理同步调用
4. terminate(Arg, State)
处理器被删除或事件管理器停止时,Module调用terminate
完成详细规范请参考erlang man手册
example-日志记录模块,保存最近的5条错误日志

-module(recent_logger).
-behaviour(gen_enevt).

-export([start/0, stop/0, log/1, report/0, release/0])

%% gen_event callbacks
-export([init/1, handle_event/2, handle_call/2, terminate/2]).
-define(NAME, logger_manager).

%% start behaviour
start() ->
case gen_event:start_link({local, ?NAME}) of
Ret = {ok, _Pid} ->
gen_event:add_handler(?NAME, ?MODULE, []),
Ret;
Other ->
Other
end.

%% stop
stop() ->
gen_envent:stop(?NAME).

%% notify an envent about log
log(E) ->
gen_enevt:notify(?NAME, {log, E}).

%% report [...]