diff --git a/src/lager.erl b/src/lager.erl index 2e44aff..6f64813 100644 --- a/src/lager.erl +++ b/src/lager.erl @@ -28,9 +28,9 @@ md/0, md/1, trace/2, trace/3, trace_file/2, trace_file/3, trace_file/4, trace_console/1, trace_console/2, clear_all_traces/0, stop_trace/1, stop_trace/3, status/0, - get_loglevel/1, set_loglevel/2, set_loglevel/3, get_loglevels/0, - update_loglevel_config/0, posix_error/1, - safe_format/3, safe_format_chop/3, dispatch_log/5, dispatch_log/9, + get_loglevel/1, set_loglevel/2, set_loglevel/3, get_loglevels/1, + update_loglevel_config/1, posix_error/1, + safe_format/3, safe_format_chop/3, dispatch_log/5, dispatch_log/6, dispatch_log/9, do_log/9, pr/2]). -type log_level() :: debug | info | notice | warning | error | critical | alert | emergency. @@ -329,7 +329,7 @@ set_loglevel(Sink, Handler, Ident, Level) when is_atom(Level) -> _ -> {Handler, Ident} end, Reply = gen_event:call(Sink, HandlerArg, {set_loglevel, Level}, infinity), - update_loglevel_config(), + update_loglevel_config(Sink), Reply. @@ -363,9 +363,9 @@ posix_error(Error) -> safe_format_chop("~p", [Error], ?DEFAULT_TRUNCATION). %% @private -get_loglevels() -> - [gen_event:call(lager_event, Handler, get_loglevel, infinity) || - Handler <- gen_event:which_handlers(lager_event)]. +get_loglevels(Sink) -> + [gen_event:call(Handler, get_loglevel, infinity) || + Handler <- gen_event:which_handlers(Sink)]. %% @private add_trace_to_loglevel_config(Trace) -> @@ -374,16 +374,16 @@ add_trace_to_loglevel_config(Trace) -> false -> NewTraces = [Trace|Traces], _ = lager_util:trace_filter([ element(1, T) || T <- NewTraces]), - lager_config:set(loglevel, {MinLevel, [Trace|Traces]}); + lager_config:set(lager_event, loglevel, {MinLevel, [Trace|Traces]}); _ -> ok end. %% @doc recalculate min log level -update_loglevel_config() -> - {_, Traces} = lager_config:get(loglevel), - MinLog = minimum_loglevel(get_loglevels()), - lager_config:set(loglevel, {MinLog, Traces}). +update_loglevel_config(Sink) -> + {_, Traces} = lager_config:get(Sink, loglevel), + MinLog = minimum_loglevel(get_loglevels(Sink)), + lager_config:set(Sink, loglevel, {MinLog, Traces}). %% @private minimum_loglevel(Levels) -> diff --git a/src/lager_app.erl b/src/lager_app.erl index 6364aef..ace1a50 100644 --- a/src/lager_app.erl +++ b/src/lager_app.erl @@ -62,6 +62,9 @@ start(_StartType, _StartArgs) -> throw({error, bad_config}) end, + %% TODO: + %% Read config for other event sinks here and start them appropriately + Handlers = case application:get_env(lager, handlers) of undefined -> [{lager_console_backend, info}, diff --git a/src/lager_config.erl b/src/lager_config.erl index 17b4140..98b18cf 100644 --- a/src/lager_config.erl +++ b/src/lager_config.erl @@ -20,10 +20,15 @@ -include("lager.hrl"). --export([new/0, get/1, get/2, set/2]). +-export([new/0, get/1, get/2, get/3, set/2, set/3]). -define(TBL, lager_config). +%% For multiple sinks, the key is now the registered event name and the old key +%% as a tuple. +%% +%% {{lager_event, loglevel}, Value} instead of {loglevel, Value} + new() -> %% set up the ETS configuration table _ = try ets:new(?TBL, [named_table, public, set, {keypos, 1}, {read_concurrency, true}]) of @@ -36,29 +41,31 @@ new() -> %% use insert_new here so that if we're in an appup we don't mess anything up %% %% until lager is completely started, allow all messages to go through - ets:insert_new(?TBL, {loglevel, {element(2, lager_util:config_to_mask(debug)), []}}), + ets:insert_new(?TBL, {{lager_event, loglevel}, {element(2, lager_util:config_to_mask(debug)), []}}), ok. - get(Key) -> - case ets:lookup(?TBL, Key) of - [] -> - undefined; - [{Key, Res}] -> - Res - end. + get(lager_event, Key, undefined). get(Key, Default) -> - try ?MODULE:get(Key) of - undefined -> + get(lager_event, Key, Default). + +get(Sink, Key, Default) -> + try + case ets:lookup(?TBL, {Sink, Key}) of + [] -> Default; - Res -> + [{{Sink, Key}, Res}] -> Res + end catch _:_ -> Default end. set(Key, Value) -> - ets:insert(?TBL, {Key, Value}). + set(lager_event, Key, Value). + +set(Sink, Key, Value) -> + ets:insert(?TBL, {{Sink, Key}, Value}). diff --git a/src/lager_sup.erl b/src/lager_sup.erl index c43bfd7..789fede 100644 --- a/src/lager_sup.erl +++ b/src/lager_sup.erl @@ -34,6 +34,11 @@ start_link() -> init([]) -> %% set up the config, is safe even during relups lager_config:new(), + %% TODO: + %% Always start lager_event as the default and make sure that + %% other gen_event stuff can start up as needed + %% + %% Maybe a new API to handle the sink and its policy? Children = [ {lager, {gen_event, start_link, [{local, lager_event}]}, permanent, 5000, worker, [dynamic]},