読者です 読者をやめる 読者になる 読者になる

gen_event のサンプル

将来の自分用にメモ、これって負荷がかかりすぎるとどうなるんでしょうね。

gen_event:start() はスタンドアローン、gen_event:start_link は supervisor 用。
logger ですので、 supervisor 下に置くのが普通だとおもいます。

test_logger.erl

-module(test_logger).

-behaviour(gen_event).

-export([init/1, handle_event/2, handle_call/2,
         handle_info/2, terminate/2, code_change/3]).

-record(state, {fd}).

init({FileName}) ->
  {ok, Fd} = file:open(FileName, write),
  {ok, #state{fd=Fd}}.

handle_event(LoggerMsg, #state{fd=Fd}=State) ->
  io:format(Fd, "Logger: ~w\n", [LoggerMsg]),
  {ok, State}.

handle_call(_Request, State) ->
  Reply = State,
  {ok, Reply, State}.

handle_info(_Info, State) ->
  {ok, State}.

terminate(_Args, #state{fd=Fd}=_State) ->
  file:close(Fd),
  ok.

code_change(_OldVsn, State, _Extra) ->
  {ok, State}.
Erlang R13B (erts-5.7.1) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.7.1  (abort with ^G)
1> c(test_logger).
{ok,test_logger}
2> gen_event:start({local, logger}).
{ok,<0.40.0>}
3> gen_event:add_handler(logger, test_logger, {"/tmp/test.log"}).
ok
4> gen_event:notify(logger, "test").
ok
$ tail -f /tmp/test.log
Logger: "test"