diff --git a/src/lager.erl b/src/lager.erl index f617b0a..068456e 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -210,7 +210,16 @@ stop_trace(Backend, Filter, Level) -> stop_trace({Backend, Filter, Level}) -> stop_trace(Backend, Filter, Level). -stop_trace_int({Backend, _Filter, _Level} = Trace) -> +%% Important: validate_trace_filters orders the arguments of +%% trace tuples differently than the way outside callers have +%% the trace tuple. +%% +%% That is to say, outside they are represented as +%% `{Backend, Filter, Level}' +%% +%% and when they come back from validation, they're +%% `{Filter, Level, Backend}' +stop_trace_int({_Filter, _Level, Backend} = Trace) -> {Level, Traces} = lager_config:get(loglevel), NewTraces = lists:delete(Trace, Traces), _ = lager_util:trace_filter([ element(1, T) || T <- NewTraces ]), diff --git a/test/lager_test_backend.erl b/test/lager_test_backend.erl index ada41a7..ad0b490 100644 --- a/test/lager_test_backend.erl +++ b/test/lager_test_backend.erl @@ -489,6 +489,24 @@ lager_test_() -> ok end }, + {"stopped trace stops and removes its event handler (gh#267)", + fun() -> + StartHandlers = gen_event:which_handlers(lager_event), + {_, T0} = lager_config:get(loglevel), + ?assertEqual([], T0), + {ok, Test} = lager:trace_file("/tmp/test", [{vhost, test}]), + MidHandlers = gen_event:which_handlers(lager_event), + ?assertEqual(length(StartHandlers)+1, length(MidHandlers)), + {_, T1} = lager_config:get(loglevel), + ?assertEqual(1, length(T1)), + ok = lager:stop_trace(Test), + {_, T2} = lager_config:get(loglevel), + ?assertEqual([], T2), + EndHandlers = gen_event:which_handlers(lager_event), + ?assertEqual(StartHandlers, EndHandlers), + ok + end + }, {"record printing works", fun() -> print_state(),