From c619263486ac7ef31c730a09b7ad273423d38525 Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Wed, 26 Oct 2011 17:44:18 -0400 Subject: [PATCH] Cleanup unused handlers when a trace is removed, documentation --- README.org | 9 +++++++++ src/lager.erl | 30 +++++++++++++++++++++++++----- src/lager_console_backend.erl | 4 ++-- src/lager_file_backend.erl | 2 +- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/README.org b/README.org index 56daa23..22369b8 100644 --- a/README.org +++ b/README.org @@ -198,3 +198,12 @@ To view the active log backends and traces, you can use the lager:status() function. To clear all active traces, you can use lager:clear_all_traces(). + + To delete a specific trace, store a handle for the trace when you create it, + that you later pass to lager:stop_trace/1: + +#+BEGIN_EXAMPLE + {ok, Trace} = lager:trace_file("log/error.log", [{module, mymodule}]), + ... + lager:stop_trace(Trace) +#+END_EXAMPLE diff --git a/src/lager.erl b/src/lager.erl index 5462495..807a5ca 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -137,16 +137,36 @@ trace_console(Filter, Level) -> Error end. -stop_trace(Trace) -> +stop_trace({_Filter, _Level, Target} = Trace) -> {MinLevel, Traces} = lager_mochiglobal:get(loglevel), - lager_mochiglobal:put(loglevel, {MinLevel, lists:delete(Trace, Traces)}), - %% TODO - somehow determine if the handler is safe to stop, its not - %$ straightforward to tell. + NewTraces = lists:delete(Trace, Traces), + lager_mochiglobal:put(loglevel, {MinLevel, NewTraces}), + case get_loglevel(Target) of + none -> + %% check no other traces point here + case lists:keyfind(Target, 3, NewTraces) of + false -> + gen_event:delete_handler(lager_event, Target, []); + _ -> + ok + end; + _ -> + ok + end, ok. clear_all_traces() -> {MinLevel, _Traces} = lager_mochiglobal:get(loglevel), - lager_mochiglobal:put(loglevel, {MinLevel, []}). + lager_mochiglobal:put(loglevel, {MinLevel, []}), + [begin + case get_loglevel(Handler) of + none -> + gen_event:delete_handler(lager_event, Handler, []); + _ -> + ok + end + end || Handler <- gen_event:which_handlers(lager_event)], + ok. status() -> Handlers = gen_event:which_handlers(lager_event), diff --git a/src/lager_console_backend.erl b/src/lager_console_backend.erl index 710d164..cc85e13 100644 --- a/src/lager_console_backend.erl +++ b/src/lager_console_backend.erl @@ -183,7 +183,7 @@ console_log_test_() -> 500 -> ?assert(true) end, - ok = lager:trace_console([{module, ?MODULE}]), + {ok, _} = lager:trace_console([{module, ?MODULE}]), lager:debug("Test message"), receive {io_request, From1, ReplyAs1, {put_chars, unicode, Msg1}} -> @@ -210,7 +210,7 @@ console_log_test_() -> 500 -> ?assert(true) end, - ok = lager:trace_console([{module, ?MODULE}]), + {ok, _} = lager:trace_console([{module, ?MODULE}]), lager:error("Test message"), receive {io_request, From1, ReplyAs1, {put_chars, unicode, Msg1}} -> diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index 6845aff..286937f 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -376,7 +376,7 @@ filesystem_test_() -> {"tracing to a dedicated file should work", fun() -> file:delete("foo.log"), - lager:trace_file("foo.log", [{module, ?MODULE}]), + {ok, _} = lager:trace_file("foo.log", [{module, ?MODULE}]), lager:error("Test message"), {ok, Bin3} = file:read_file("foo.log"), ?assertMatch([_, _, "[error]", _, "Test message\n"], re:split(Bin3, " ", [{return, list}, {parts, 5}]))