From 8bc6408ec046b40d53b3336313316548d3b77a39 Mon Sep 17 00:00:00 2001 From: pvmart Date: Sat, 23 May 2015 23:27:01 +0800 Subject: [PATCH 1/3] fix lager:stop_trace Fix stop_trace_int so it can remove an event handler --- src/lager.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lager.erl b/src/lager.erl index cfae17d..24a6a29 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -209,7 +209,7 @@ stop_trace(Backend, Filter, Level) -> stop_trace({Backend, Filter, Level}) -> stop_trace(Backend, Filter, Level). -stop_trace_int({Backend, _Filter, _Level} = Trace) -> +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 ]), From cb5114fbc3705f202be04bb940449f968becd882 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Tue, 19 Jan 2016 11:34:18 -0600 Subject: [PATCH 2/3] Delete trace from the global handler list too --- src/lager.erl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lager.erl b/src/lager.erl index 475f35a..f77c822 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -294,7 +294,10 @@ stop_trace_int({_Filter, _Level, Backend} = Trace, Sink) -> %% check no other traces point here case lists:keyfind(Backend, 3, NewTraces) of false -> - gen_event:delete_handler(Sink, Backend, []); + gen_event:delete_handler(Sink, Backend, []), + lager_config:global_set(handlers, + lists:keydelete(Backend, 1, + lager_config:global_get(handlers))); _ -> ok end; From 0fb72d7744d6c45f1ab3af31a866c587b71d81be Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Tue, 19 Jan 2016 11:35:01 -0600 Subject: [PATCH 3/3] Add tests for stopping traces gh#267 --- test/lager_test_backend.erl | 66 +++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/test/lager_test_backend.erl b/test/lager_test_backend.erl index 3b41ca5..27f0aa6 100644 --- a/test/lager_test_backend.erl +++ b/test/lager_test_backend.erl @@ -536,6 +536,39 @@ lager_test_() -> ok end }, + {"stopped trace stops and removes its event handler - default sink (gh#267)", + fun() -> + Sink = ?DEFAULT_SINK, + StartHandlers = gen_event:which_handlers(Sink), + {_, T0} = lager_config:get({Sink, loglevel}), + StartGlobal = lager_config:global_get(handlers), + ?assertEqual([], T0), + {ok, TestTrace1} = lager:trace_file("/tmp/test", [{a,b}]), + MidHandlers = gen_event:which_handlers(Sink), + {ok, TestTrace2} = lager:trace_file("/tmp/test", [{c,d}]), + MidHandlers = gen_event:which_handlers(Sink), + ?assertEqual(length(StartHandlers)+1, length(MidHandlers)), + MidGlobal = lager_config:global_get(handlers), + ?assertEqual(length(StartGlobal)+1, length(MidGlobal)), + {_, T1} = lager_config:get({Sink, loglevel}), + ?assertEqual(2, length(T1)), + ok = lager:stop_trace(TestTrace1), + {_, T2} = lager_config:get({Sink, loglevel}), + ?assertEqual(1, length(T2)), + ?assertEqual(length(StartHandlers)+1, length( + gen_event:which_handlers(Sink))), + + ?assertEqual(length(StartGlobal)+1, length(lager_config:global_get(handlers))), + ok = lager:stop_trace(TestTrace2), + EndHandlers = gen_event:which_handlers(?DEFAULT_SINK), + EndGlobal = lager_config:global_get(handlers), + {_, T3} = lager_config:get({Sink, loglevel}), + ?assertEqual([], T3), + ?assertEqual(StartHandlers, EndHandlers), + ?assertEqual(StartGlobal, EndGlobal), + ok + end + }, {"record printing works", fun() -> print_state(), @@ -691,6 +724,39 @@ extra_sinks_test_() -> ok end }, + {"stopped trace stops and removes its event handler - test sink (gh#267)", + fun() -> + Sink = ?TEST_SINK_EVENT, + StartHandlers = gen_event:which_handlers(Sink), + {_, T0} = lager_config:get({Sink, loglevel}), + StartGlobal = lager_config:global_get(handlers), + ?assertEqual([], T0), + {ok, TestTrace1} = lager:trace_file("/tmp/test", [{sink, Sink}, {a,b}]), + MidHandlers = gen_event:which_handlers(Sink), + {ok, TestTrace2} = lager:trace_file("/tmp/test", [{sink, Sink}, {c,d}]), + MidHandlers = gen_event:which_handlers(Sink), + ?assertEqual(length(StartHandlers)+1, length(MidHandlers)), + MidGlobal = lager_config:global_get(handlers), + ?assertEqual(length(StartGlobal)+1, length(MidGlobal)), + {_, T1} = lager_config:get({Sink, loglevel}), + ?assertEqual(2, length(T1)), + ok = lager:stop_trace(TestTrace1), + {_, T2} = lager_config:get({Sink, loglevel}), + ?assertEqual(1, length(T2)), + ?assertEqual(length(StartHandlers)+1, length( + gen_event:which_handlers(Sink))), + + ?assertEqual(length(StartGlobal)+1, length(lager_config:global_get(handlers))), + ok = lager:stop_trace(TestTrace2), + EndHandlers = gen_event:which_handlers(Sink), + EndGlobal = lager_config:global_get(handlers), + {_, T3} = lager_config:get({Sink, loglevel}), + ?assertEqual([], T3), + ?assertEqual(StartHandlers, EndHandlers), + ?assertEqual(StartGlobal, EndGlobal), + ok + end + }, {"log messages below the threshold are ignored", fun() -> ?assertEqual(0, count(?TEST_SINK_EVENT)),