|
|
@ -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} |
|
|
|