diff --git a/src/backend/lgBkdThrottle.erl b/src/backend/lgBkdThrottle.erl index af339bc..7601bb7 100644 --- a/src/backend/lgBkdThrottle.erl +++ b/src/backend/lgBkdThrottle.erl @@ -27,7 +27,7 @@ async = true :: boolean() }). -init([{sink, Sink}, Hwm, Window]) -> +init([Sink, Hwm, Window]) -> lgConfig:ptSet({Sink, async}, true), {ok, #state{sink = Sink, hwm = Hwm, window = Hwm - Window}}. @@ -39,16 +39,16 @@ handleCall(_Msg, State) -> ?ERR(<<"~p call receive unexpect msg ~p ~n ">>, [?MODULE, _Msg]), {reply, ok, State}. -handleEvent({mWriteLog, _Message}, #state{hwm = Hwm, window = Window, async = Async} = State) -> +handleEvent({mWriteLog, _Message}, #state{sink = Sink, hwm = Hwm, window = Window, async = Async} = State) -> {_, MsgLen} = erlang:process_info(self(), message_queue_len), if MsgLen > Hwm andalso Async -> %% need to flip to sync mode - lgConfig:ptSet({State#state.sink, async}, false), + lgConfig:ptSet({Sink, async}, false), {ok, State#state{async = false}}; MsgLen < Window andalso not Async -> %% need to flip to async mode - lgConfig:ptSet({State#state.sink, async}, true), + lgConfig:ptSet({Sink, async}, true), {ok, State#state{async = true}}; true -> %% nothing needs to change diff --git a/src/eLog.erl b/src/eLog.erl index a4be3d0..c17051a 100644 --- a/src/eLog.erl +++ b/src/eLog.erl @@ -327,13 +327,7 @@ stopTrace({Backend, Filter, Level}) -> validateTraceFilters(Filters, Level, Backend) -> Sink = proplists:get_value(sink, Filters, ?LgDefSink), - {Sink, - lgUtil:validate_trace({ - proplists:delete(sink, Filters), - Level, - Backend - }) - }. + {Sink, lgUtil:validate_trace({proplists:delete(sink, Filters), Level, Backend})}. %% Important: validate_trace_filters orders the arguments of %% trace tuples differently than the way outside callers have @@ -358,9 +352,7 @@ stopTraceInt({_Filter, _Level, Backend} = Trace, Sink) -> case lists:keyfind(Backend, 3, NewTraces) of false -> gen_emm:delEpm(Sink, Backend, []), - lgConfig:ptSet(handlers, - lists:keydelete(Backend, 1, - lgConfig:ptGet(handlers, []))); + lgConfig:ptSet(handlers, lists:keydelete(Backend, 1, lgConfig:ptGet(handlers, []))); _ -> ok end; diff --git a/src/eLog_app.erl b/src/eLog_app.erl index 7aac01e..f5ff01b 100644 --- a/src/eLog_app.erl +++ b/src/eLog_app.erl @@ -98,9 +98,9 @@ tryStartAsyncMgr(undefined, _Window, _Sink) -> tryStartAsyncMgr(Threshold, Window, Sink) -> case Window of undefined -> - supervisor:start_child(lgHWatcherSup, [Sink, lgBkdThrottle, [Threshold, erlang:trunc(Threshold * 0.2)]]); + supervisor:start_child(lgHWatcherSup, [Sink, lgBkdThrottle, [Sink, Threshold, erlang:trunc(Threshold * 0.2)]]); _ -> - supervisor:start_child(lgHWatcherSup, [Sink, lgBkdThrottle, [Threshold, Window]]) + supervisor:start_child(lgHWatcherSup, [Sink, lgBkdThrottle, [Sink, Threshold, Window]]) end, ok. @@ -124,16 +124,16 @@ tryStartHandlers(Handlers, Sink) -> doStartHandlers([], _Sink, _NameAcc, HandlerAcc) -> HandlerAcc; doStartHandlers([OneHandler | Handlers], Sink, NameAcc, HandlerAcc) -> - {Module, Options} = parseHandlers(OneHandler), + {Module, Options} = tryMakeHandlerId(OneHandler), NewNameAcc = case Module of - {lgBkFile, F} -> - case lists:member(F, NameAcc) of + {lgBkFile, FId} -> + case lists:member(FId, NameAcc) of true -> - error_logger:error_msg(<<"Cannot have same file (~p) in multiple file backends~n">>, [F]), + error_logger:error_msg(<<"Cannot have same file (~p) in multiple file backends~n">>, [FId]), throw({error, bad_config}); _ -> - [F | NameAcc] + [FId | NameAcc] end; _ -> NameAcc @@ -167,14 +167,12 @@ tryStartErrLoggerHandler(_ErrLoggerRedirect, Hwm, WhiteList) -> %% capture which handlers we removed from error_logger so we can restore them when eLog stops %% 捕获从error_logger中删除的处理程序,以便在eLog停止时恢复它们 - OldHandlers = - case supervisor:start_child(lgHWatcherSup, [error_logger, lgErrLoggerH, [Hwm, lgUtil:get_env(errLoggerGLS, handle)]]) of - {ok, _} -> - [begin error_logger:delete_report_handler(X), X end || X <- gen_event:which_handlers(error_logger) -- [lgErrLoggerH | WhiteList]]; - {error, _} -> - [] - end, - OldHandlers. + case supervisor:start_child(lgHWatcherSup, [error_logger, lgErrLoggerH, [Hwm, lgUtil:get_env(errLoggerGLS, handle)]]) of + {ok, _} -> + [begin error_logger:delete_report_handler(X), X end || X <- gen_event:which_handlers(error_logger) -- [lgErrLoggerH | WhiteList]]; + {error, _} -> + [] + end. %% 在OTP 21.1及更高版本上,我们需要删除`default' handler。但是它可能不存在,因此我们将其包装在try-catch块中 tryRemoveLoggerHandler() -> @@ -186,25 +184,11 @@ tryRemoveLoggerHandler() -> error_logger:error_msg(<<"calling logger:remove_handler(default) failed: ~p ~p">>, [Err, Reason]) end. -parseHandlers([]) -> - []; -parseHandlers({lgBkdFile, Config}) -> - %% this is definitely a new-style config, no expansion needed - maybe_make_handler_id(lgBkdFile, Config); -parseHandlers({Mod, Config}) -> - maybe_make_handler_id(Mod, Config). - -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. - +tryMakeHandlerId({Mod, Config}) -> %%允许后端生成gen_event处理程序id,如果它愿意的话。 %%这里我们没有使用erlang:function_exported,因为这需要用到模块 %%已经加载,这在启动阶段是不太可能的。使用代码:负载 %%会在生成代码覆盖率报告时产生不良的副作用。 - try Mod:configToId(Config) of Id -> {Id, Config} diff --git a/src/watcher/lgHWatcherSrv.erl b/src/watcher/lgHWatcherSrv.erl index 984c70c..cd2c1c4 100644 --- a/src/watcher/lgHWatcherSrv.erl +++ b/src/watcher/lgHWatcherSrv.erl @@ -99,7 +99,7 @@ installHandler(Module, Config, Sink) -> lgBkThrottle -> %% lgBkdThrottle需要知道它连接到哪个接收器,因此这个公认的丑陋的解决方案。处理程序对发送到' init'的配置结构是敏感的, %% 遗憾的是,在不破坏第三方处理程序的情况下,向后端添加一个要忽略的配置项并不是一件小事。 - gen_emm:add_sup_epm(Sink, Module, [{sink, Sink} | Config]); + gen_emm:add_sup_epm(Sink, Module, Config); _ -> gen_emm:add_sup_epm(Sink, Module, Config) end,