From 69f6d06d6fb62c65154c2c77d8fd241f1b928c5f Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Thu, 17 Dec 2015 15:14:17 -0600 Subject: [PATCH 1/2] Fix tuple argument order to remove backend See PR #306 for details. This is a backport. --- src/lager.erl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 ]), From 9ee64cd717a4191172060cfe4b538a51669f0259 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Tue, 19 Jan 2016 10:04:08 -0600 Subject: [PATCH 2/2] Add a test case for this fix Ensure stopped traces remove their event handlers and actually stop. --- test/lager_test_backend.erl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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(),