ハンドラーのバージョンがいくつかgen_event
あり、プログラムの実行中にそれらを変更したいとします。
-module(logger_all).
-behaviour(gen_event).
-export([init/1, handle_event/2, terminate/2]).
init(_Args) ->
{ok, []}.
handle_event({Severity, ErrorMsg}, State) ->
io:format("***~p*** ~p~n", [Severity, ErrorMsg]),
{ok, State}.
terminate(_Args, _State) ->
ok.
-module(logger_errors_only).
-behaviour(gen_event).
-export([init/1, handle_event/2, terminate/2]).
init(_Args) ->
{ok, []}.
handle_event({error, ErrorMsg}, State) ->
io:format("***Error*** ~p~n", [ErrorMsg]),
{ok, State}.
handle_event({_, ErrorMsg}, State) ->
{ok, State}. %% ignore everything except errors
terminate(_Args, _State) ->
ok.
明らかに、1つのハンドラーを削除し、もう1つのハンドラーを追加することで、それらを切り替えることができます。
log_errors_only() ->
gen_event:delete_handler(error_man, logger_all, []),
gen_event:add_handler(error_man, logger_errors_only, []).
しかし、これは競合状態の可能性を残します。間違ったタイミングでイベントを受信した場合error_man
、そのイベントはログに記録されません。または、アクションの順序を変更すると、2回ログに記録されますが、これも望ましくありません。一度正確に処理されたことを確認するにはどうすればよいですか?
この場合、ハンドラーを1つだけ持つことができ、ログレベルをとして維持できますState
が、これは受け入れられないとします。