diff --git a/src/eRum_app.erl b/src/eRum_app.erl index b059a02..c5af16f 100644 --- a/src/eRum_app.erl +++ b/src/eRum_app.erl @@ -9,9 +9,9 @@ , start/2 , stop/1 , doStart/0 - , doStart/1 + , doStartExtraSink/1 , startHandler/3 - , configure_sink/2 + , startSink/2 ]). @@ -22,8 +22,8 @@ start() -> start(_StartType, _StartArgs) -> {ok, Pid} = eRum_sup:start_link(), SavedHandlers = doStart(), - _ = doStart('__all_extra'), - _ = doStart('__traces'), + _ = doStartExtraSink(), + doStartTraces(), {ok, Pid, SavedHandlers}. %% 启动默认的接收器(sink) @@ -42,27 +42,35 @@ doStart() -> eRum:updateLogevelCfg(?RumDefSink), SavedHandlers. -doStart('__traces') -> +doStartTraces() -> _ = rumUtil:trace_filter(none), - ok = add_configured_traces(); + ok = addTraces(). -doStart('__all_extra') -> - doStartExtraSinks(rumUtil:get_env(extra_sinks, [])); +addTraces() -> + Traces = rumUtil:get_env(traces, []), + [startTrace(One) || One <- Traces], + ok. + +startTrace({Handler, Filter}) -> + {ok, _} = eRum:trace(Handler, Filter); +startTrace({Handler, Filter, Level}) when is_atom(Level) -> + {ok, _} = eRum:trace(Handler, Filter, Level). + +doStartExtraSink() -> + doStartExtraSinks(rumUtil:get_env(extra_sinks, [])). -doStart(?RumDefSink) -> doStart(); -doStart(Sink) -> +doStartExtraSink(?RumDefSink) -> doStart(); +doStartExtraSink(Sink) -> AllSinksDef = rumUtil:get_env(extra_sinks, []), boot_sink(Sink, lists:keyfind(Sink, 1, AllSinksDef)). boot_sink(Sink, {Sink, Def}) -> - configure_sink(Sink, Def); + startSink(Sink, Def); boot_sink(Sink, false) -> - configure_sink(Sink, []). + startSink(Sink, []). stop(Handlers) -> - lists:foreach(fun(Handler) -> - error_logger:add_report_handler(Handler) - end, Handlers), + [error_logger:add_report_handler(Handler) || Handler <- Handlers], rumConfig:cleanup(). tryStartAsyncMgr(undefined, _Window, _SinkS) -> @@ -96,18 +104,18 @@ tryStartHandlers(Handlers, Sink) -> doStartHandlers([], _Sink, _NameAcc, HandlerAcc) -> HandlerAcc; doStartHandlers([OneHandler | Handlers], Sink, NameAcc, HandlerAcc) -> - {Module, Options} = expand_handlers(OneHandler), - case Module of + {Module, Options} = parseHandlers(OneHandler), + NewNameAcc = case Module of {rumBackendFile, F} -> case lists:member(F, NameAcc) of true -> error_logger:error_msg("Cannot have same file (~p) in multiple file backends~n", [F]), throw({error, bad_config}); _ -> - NewNameAcc = [F | NameAcc] + [F | NameAcc] end; _ -> - NewNameAcc = NameAcc + NameAcc end, HandlerRet = startHandler(Sink, Module, Options), @@ -156,58 +164,53 @@ tryRemoveLoggerHandler() -> error_logger:error_msg("calling logger:remove_handler(default) failed: ~p ~p", [Err, Reason]) end. -configure_sink(Sink, SinkDef) -> +doStartExtraSinks(Sinks) -> + [startSink(Sink, Opts) || {Sink, Opts} <- Sinks], + ok. + +startSink(Sink, SinkDef) -> rumConfig:initSink(Sink), ChildId = rumUtil:makeInnerSinkName(Sink), - _ = supervisor:start_child(eRum_sup, {ChildId, {gen_event, start_link, [{local, Sink}]}, permanent, 5000, worker, dynamic}), - tryStartAsyncMgr(Sink, proplists:get_value(asyncThreshold, SinkDef), proplists:get_value(asyncThresholdWindow, SinkDef)), - _ = tryInstallKiller(Sink, proplists:get_value(killerHwm, SinkDef), proplists:get_value(killerReTime, SinkDef)), + SinkSpec = #{ + id => ChildId, + start => {gen_event, start_link, [{local, Sink}]}, + restart => permanent, + shutdown => 5000, + type => worker, + modules => [dynamic]}, + _ = supervisor:start_child(eRum_sup,SinkSpec), + tryStartAsyncMgr(proplists:get_value(asyncThreshold, SinkDef), proplists:get_value(asyncThresholdWindow, SinkDef), Sink), + tryInstallKiller(proplists:get_value(killerHwm, SinkDef), proplists:get_value(killerReTime, SinkDef), Sink), tryStartHandlers(proplists:get_value(handlers, SinkDef, []), Sink), eRum:updateLogevelCfg(Sink). -doStartExtraSinks(Sinks) -> - [configure_sink(Sink, Opts) || {Sink, Opts} <- Sinks], - ok. - - - -expand_handlers([]) -> +parseHandlers([]) -> []; -expand_handlers([{lager_file_backend, [{Key, _Value} | _] = Config} | T]) when is_atom(Key) -> +parseHandlers([{lager_file_backend, [{Key, _Value} | _] = Config} | T]) when is_atom(Key) -> %% this is definitely a new-style config, no expansion needed - [maybe_make_handler_id(lager_file_backend, Config) | expand_handlers(T)]; -expand_handlers([{lager_file_backend, Configs} | T]) -> + [maybe_make_handler_id(lager_file_backend, Config) | parseHandlers(T)]; +parseHandlers([{lager_file_backend, Configs} | T]) -> ?INT_LOG(notice, "Deprecated lager_file_backend config detected, please consider updating it", []), [{rumBackendFile:config_to_id(Config), Config} || Config <- Configs] ++ - expand_handlers(T); -expand_handlers([{Mod, Config} | T]) when is_atom(Mod) -> - [maybe_make_handler_id(Mod, Config) | expand_handlers(T)]; -expand_handlers([H | T]) -> - [H | expand_handlers(T)]. - -add_configured_traces() -> - Traces = case application:get_env(lager, traces) of - undefined -> - []; - {ok, TraceVal} -> - TraceVal - end, - - lists:foreach(fun start_configured_trace/1, Traces), - ok. - -start_configured_trace({Handler, Filter}) -> - {ok, _} = eRum:trace(Handler, Filter); -start_configured_trace({Handler, Filter, Level}) when is_atom(Level) -> - {ok, _} = eRum:trace(Handler, Filter, Level). + parseHandlers(T); +parseHandlers([{Mod, Config} | T]) when is_atom(Mod) -> + [maybe_make_handler_id(Mod, Config) | parseHandlers(T)]; +parseHandlers([H | T]) -> + [H | parseHandlers(T)]. maybe_make_handler_id(Mod, Config) -> %% Allow the backend to generate a gen_event handler id, if it wants to. %% We don't use erlang:function_exported here because that requires the module %% already be loaded, which is unlikely at this phase of startup. Using code:load %% caused undesirable side-effects with generating code-coverage reports. + +%%允许后端生成gen_event处理程序id,如果它愿意的话。 +%%这里我们没有使用erlang:function_exported,因为这需要用到模块 +%%已经加载,这在启动阶段是不太可能的。使用代码:负载 +%%会在生成代码覆盖率报告时产生不良的副作用。 + try Mod:config_to_id(Config) of Id -> {Id, Config}